C++生产者和消费者模式线程池及线程池安全
时间: 2025-06-06 10:00:44 浏览: 12
<think>我们在实现一个支持生产者-消费者模式的线程池时,需要考虑以下几点:1.线程池管理一组工作线程(消费者),它们等待并处理任务队列中的任务。2.生产者线程(可以是主线程或其他线程)向任务队列添加任务。3.任务队列需要线程安全,因此需要互斥锁和条件变量来同步。4.当任务队列为空时,消费者线程应该等待;当有任务时,唤醒一个或多个消费者线程。5.需要支持优雅关闭线程池。根据引用[2]中线程池的构造,我们可以借鉴其结构,同时结合生产者-消费者模式。设计思路:-使用一个队列(std::queue)来存储任务(使用std::function<void()>封装的可调用对象)。-使用std::mutex来保护任务队列的访问。-使用std::condition_variable来通知消费者线程有任务到来或线程池停止。-使用一个标志(如stop)来指示线程池是否停止。代码步骤:1.线程池构造函数:创建指定数量的工作线程,每个线程都循环等待任务队列中的任务。2.生产者:通过一个enqueue函数将任务添加到队列中。添加任务后,通知一个等待的线程。3.消费者(工作线程):循环等待,当有任务时取出任务执行;当队列为空且线程池未停止时,等待条件变量;当线程池停止时,退出循环。4.析构函数:设置停止标志,唤醒所有线程,并等待每个线程结束。注意:为了避免虚假唤醒,条件变量的等待应该使用循环检查条件。以下是一个简化的代码示例:</think>
### C++线程池实现生产者-消费者模式(线程安全)
以下是结合线程池的生产者-消费者模型实现要点和完整代码示例:
#### 核心组件
1. **任务队列**:存储待处理任务(线程安全)
2. **线程池**:管理消费者线程
3. **同步机制**:
- `std::mutex`:保护共享资源
- `std::condition_variable`:线程间通知
- `std::atomic<bool>`:优雅停止标志
#### 完整代码实现
```cpp
#include <iostream>
#include <vector>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <atomic>
class ThreadPool {
public:
explicit ThreadPool(size_t numThreads)
: stop(false) {
for (size_t i = 0; i < numThreads; ++i) {
workers.emplace_back([this] {
while (true) {
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(); // 执行任务
}
});
}
}
//
阅读全文
相关推荐


















