c++实现一个复杂的线程池,提供全部代码和注释
时间: 2024-11-10 21:26:40 浏览: 14
ThreadPool_Windows编程_线程池c++_源码
在C++中,创建一个复杂的线程池通常涉及多线程、互斥锁、条件变量以及任务队列等机制。这里是一个简化的例子,展示了如何使用`std::thread`, `std::queue`, `std::mutex`和`std::condition_variable`来创建一个基础的线程池:
```cpp
#include <iostream>
#include <vector>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
// 线程池大小
const int POOL_SIZE = 4;
// 线程池工作队列
std::queue<std::function<void()>> work_queue;
std::mutex queue_mutex; // 保护队列
std::condition_variable queue_not_empty; // 队列非空信号
// 工作线程函数
void worker_thread() {
while (true) {
std::unique_lock<std::mutex> lock(queue_mutex);
// 当队列为空且等待条件满足时唤醒线程
if (work_queue.empty()) {
queue_not_empty.wait(lock);
}
if (!work_queue.empty()) {
try {
// 从队列取出任务并执行
(*work_queue.front())();
work_queue.pop(); // 移除已处理的任务
} catch (...) {
// 异常处理,如果任务失败,我们只是忽略它并继续
std::cerr << "Error executing task" << std::endl;
}
}
}
}
int main() {
// 创建线程池
std::vector<std::thread> threads(POOL_SIZE, worker_thread);
// 启动任务
for (size_t i = 0; i < 10; ++i) {
std::lock_guard<std::mutex> lock(queue_mutex);
work_queue.push(std::bind(&do_something_complex, i));
queue_not_empty.notify_one(); // 唤醒一个等待的线程
}
// 等待所有任务完成
for (auto& t : threads) {
t.join();
}
return 0;
}
// 假设有一个复杂任务的函数
void do_something_complex(int id) {
std::cout << "Task " << id << " started by thread " << std::this_thread::get_id() << std::endl;
// 这里添加实际的复杂操作...
std::cout << "Task " << id << " finished" << std::endl;
}
```
在这个例子中,`worker_thread`不断地从`work_queue`中取出任务执行。当队列为空时,线程会进入等待状态,直到有新任务加入。`main`函数则负责提交任务到队列,并确保所有线程都被唤醒。
注意这只是一个简化版的线程池实现,实际应用中可能需要考虑错误处理、资源管理以及更高级的控制逻辑,如支持动态调整线程数等。
阅读全文