生产者消费者问题c++
时间: 2023-10-18 21:10:10 浏览: 64
生产者消费者问题是一个经典的线程同步问题,它描述了一个多线程环境中的生产者和消费者在共享缓冲区中的操作。下面是一个简单的 C++ 实现:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
std::mutex mtx;
std::condition_variable cv;
std::queue<int> q;
void producer(int num) {
for (int i = 0; i < num; ++i) {
std::unique_lock<std::mutex> lock(mtx);
q.push(i);
std::cout << "producer: " << i << std::endl;
lock.unlock();
cv.notify_all(); // 通知消费者
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 暂停一段时间
}
}
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return !q.empty(); }); // 等待队列不为空
int val = q.front();
q.pop();
std::cout << "consumer: " << val << std::endl;
lock.unlock();
std::this_thread::sleep_for(std::chrono::milliseconds(200)); // 暂停一段时间
}
}
int main() {
std::thread t1(producer, 10); // 创建生产者线程
std::thread t2(consumer); // 创建消费者线程
t1.join();
t2.join();
return 0;
}
```
在这个例子中,我们使用了一个 `std::mutex` 对共享队列进行加锁,避免了多个线程同时访问的问题。同时,我们使用了一个 `std::condition_variable` 来实现线程间的通信。当生产者往队列中插入数据时,它会通过 `cv.notify_all()` 通知消费者有新的数据可用。而当队列为空时,消费者会调用 `cv.wait()` 进入等待状态,直到有新的数据可用为止。这样可以避免不必要的 CPU 使用和线程调度开销。
阅读全文