生产者消费者实现同步代码
时间: 2024-05-04 11:19:58 浏览: 74
以下是一个简单的生产者消费者同步代码实现,使用了条件变量(Condition Variable)来进行线程同步:
```C++
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
queue<int> q; // 全局队列
mutex m; // 互斥锁
condition_variable cv; // 条件变量
int cnt = 0; // 生产者生产的数量
const int MAX_CNT = 10; // 生产者生产的最大数量
void producer()
{
while (cnt < MAX_CNT)
{
unique_lock<mutex> lk(m);
cv.wait(lk, [](){ return q.size() < 5; }); // 如果队列中元素个数 >= 5,则等待
q.push(cnt);
cout << "生产者生产了 " << cnt++ << endl;
lk.unlock();
cv.notify_all();
this_thread::sleep_for(chrono::seconds(1)); // 睡眠1秒钟
}
}
void consumer()
{
while (true)
{
unique_lock<mutex> lk(m);
cv.wait(lk, [](){ return !q.empty(); }); // 如果队列为空,则等待
int value = q.front();
q.pop();
cout << "消费者消费了 " << value << endl;
lk.unlock();
cv.notify_all();
this_thread::sleep_for(chrono::seconds(2)); // 睡眠2秒钟
}
}
int main()
{
thread t1(producer);
thread t2(consumer);
t1.join();
t2.join();
return 0;
}
```
在这个代码中,生产者线程和消费者线程共享一个全局队列 `q`,并且使用了互斥锁 `m` 和条件变量 `cv` 来保证线程安全。其中,互斥锁 `m` 用于保护共享资源(队列 `q`)的访问操作,条件变量 `cv` 用于实现线程之间的等待和唤醒操作。
在生产者线程中,首先获取互斥锁 `m`,然后使用条件变量 `cv` 等待队列中元素个数小于 5 的条件。如果条件不满足,则线程等待并释放互斥锁 `m`,直到被其他线程唤醒。如果条件满足,则生产者将一个元素加入队列 `q` 中,并输出生产信息,最后释放互斥锁 `m` 并唤醒其他线程。
在消费者线程中,首先获取互斥锁 `m`,然后使用条件变量 `cv` 等待队列不为空的条件。如果条件不满足,则线程等待并释放互斥锁 `m`,直到被其他线程唤醒。如果条件满足,则消费者从队列 `q` 中取出一个元素,并输出消费信息,最后释放互斥锁 `m` 并唤醒其他线程。
阅读全文