C++实现生产者消费者问题
时间: 2023-10-20 19:06:35 浏览: 121
生产者消费者问题是一个经典的多线程同步问题,可以使用C++中的互斥锁和条件变量来实现。
以下是一个简单的生产者消费者问题的C++代码示例:
```cpp
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
queue<int> q; // 生产者消费者队列
mutex m; // 互斥锁
condition_variable cv; // 条件变量
const int MAX_SIZE = 10; // 队列最大容量
int product_id = 0; // 生产者生产的产品编号
// 生产者线程函数
void producer() {
while (true) {
unique_lock<mutex> lock(m);
// 如果队列已满,则等待
cv.wait(lock, []() { return q.size() < MAX_SIZE; });
// 生产产品
q.push(++product_id);
cout << "Producer produces product " << product_id << endl;
// 通知消费者队列中有产品可用
cv.notify_all();
lock.unlock();
// 生产完一个产品后休眠
this_thread::sleep_for(chrono::milliseconds(500));
}
}
// 消费者线程函数
void consumer() {
while (true) {
unique_lock<mutex> lock(m);
// 如果队列为空,则等待
cv.wait(lock, []() { return !q.empty(); });
// 消费产品
int product = q.front();
q.pop();
cout << "Consumer consumes product " << product << endl;
// 通知生产者队列中有空位
cv.notify_all();
lock.unlock();
// 消费完一个产品后休眠
this_thread::sleep_for(chrono::milliseconds(1000));
}
}
int main() {
thread producer_thread(producer);
thread consumer_thread(consumer);
producer_thread.join();
consumer_thread.join();
return 0;
}
```
在上面的代码中,我们定义了一个生产者消费者队列 `q`,一个互斥锁 `m` 和一个条件变量 `cv`。生产者线程函数 `producer` 不断地生产产品,并将其加入队列中,如果队列已满,则等待条件变量 `cv`。消费者线程函数 `consumer` 不断地消费产品,并将其从队列中移除,如果队列为空,则等待条件变量 `cv`。
在生产者线程函数中,我们使用了 `unique_lock` 对互斥锁进行加锁,然后调用 `cv.wait` 等待条件变量。在等待期间,该线程会释放互斥锁,等待其他线程调用 `notify_all` 函数通知该线程条件变量的状态发生了变化。当条件变量的状态发生变化时,线程会重新获取互斥锁并继续执行。
在消费者线程函数中,我们也使用了 `unique_lock` 对互斥锁进行加锁,并调用 `cv.wait` 等待条件变量。当队列不为空时,线程从队列中取出一个产品并进行消费,并使用 `cv.notify_all` 函数通知生产者线程队列中有空位。
在主函数中,我们创建了两个线程分别执行生产者线程函数和消费者线程函数,并等待两个线程执行完毕后退出程序。
阅读全文