如和实现一个服务器端高并发线程池
实现一个服务器端线程池需要处理多个客户端请求,同时提高资源利用率和响应速度。
- 在
main
函数中,创建一个线程池并提交多个任务。 - 每个任务在不同的线程中执行,演示了线程池的并发处理能力
#include <iostream>
#include <vector>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <atomic>
// 线程池类定义
class ThreadPool {
public:
// 构造函数,接受线程数量作为参数
ThreadPool(size_t numThreads);
// 析构函数
~ThreadPool();
// 向任务队列中添加任务
void enqueueTask(std::function<void()> task);
private:
// 工作线程的集合
std::vector<std::thread> workers;
// 任务队列
std::queue<std::function<void()>> tasks;
// 互斥锁保护任务队列
std::mutex queueMutex;
// 条件变量用于线程同步
std::condition_variable condition;
// 原子布尔值,用于指示线程池是否停止
std::atomic<bool> stop;
// 每个线程执行的函数
void workerThread();
};
// 线程池构造函数
ThreadPool::ThreadPool(size_t numThreads) : stop(false) {
// 创建指定数量的线程,并将它们添加到工作线程集合中
for (size_t i = 0; i < numThreads; ++i) {
workers.emplace_back([this] { this->workerThread(); });
}
}
// 线程池析构函数
ThreadPool::~ThreadPool() {
// 设置停止标志为true
stop = true;
// 通知所有等待的线程
condition.notify_all();
// 等待所有线程完成工作
for (std::thread &worker : workers) {
if (worker.joinable()) {
worker.join();
}
}
}
// 将任务添加到任务队列中
void ThreadPool::enqueueTask(std::function<void()> task) {
{
// 加锁以保护任务队列
std::unique_lock<std::mutex> lock(queueMutex);
// 将任务添加到队列中
tasks.push(task);
}
// 通知一个等待的线程
condition.notify_one();
}
// 每个线程执行的函数,从任务队列中提取任务并执行
void ThreadPool::workerThread() {
while (!stop) {
std::function<void()> task;
{
// 加锁以保护任务队列
std::unique_lock<std::mutex> lock(queueMutex);
// 等待直到有任务或停止标志被设置
condition.wait(lock, [this] { return stop || !tasks.empty(); });
// 如果停止标志被设置且任务队列为空,则退出
if (stop && tasks.empty()) {
return;
}
// 从任务队列中取出一个任务
task = std::move(tasks.front());
tasks.pop();
}
// 执行任务
task();
}
}
// 主函数,演示线程池的使用
int main() {
// 创建一个线程池,包含4个线程
ThreadPool pool(4);
// 提交8个任务到线程池
for (int i = 0; i < 8; ++i) {
pool.enqueueTask([i] {
std::cout << "Processing task " << i << " in thread " << std::this_thread::get_id() << std::endl;
});
}
// 等待一段时间以确保所有任务完成
std::this_thread::sleep_for(std::chrono::seconds(2));
return 0;
}
- ThreadPool类:表示线程池,包含线程向量、任务队列、互斥锁、条件变量和停止标志。
- 构造函数:初始化线程池,创建指定数量的线程,并将每个线程指向
workerThread
函数。 - 析构函数:设置停止标志,通知所有线程并等待它们完成。
- enqueueTask方法:将任务添加到任务队列中,并通知一个等待线程。
- workerThread方法:线程工作函数,从任务队列中提取任务并执行。