请帮我写一个生产者-消费者同步与互斥的C++代码
时间: 2023-08-28 07:22:22 浏览: 116
好的,下面是一个简单的生产者-消费者同步与互斥的C++代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
using namespace std;
queue<int> q; // 生产者和消费者共享队列
mutex mtx; // 互斥锁,保证线程安全
condition_variable cv; // 条件变量,用于线程同步
void producer() {
for (int i = 1; i <= 10; ++i) {
unique_lock<mutex> lck(mtx); // 加锁,保证线程安全
q.push(i); // 生产者生产物品
cout << "Producer produced " << i << endl;
cv.notify_all(); // 唤醒等待的线程
this_thread::sleep_for(chrono::milliseconds(500)); // 睡眠500毫秒
}
}
void consumer() {
while (true) {
unique_lock<mutex> lck(mtx); // 加锁,保证线程安全
while (q.empty()) { // 队列为空时等待
cv.wait(lck); // 等待唤醒
}
int x = q.front(); // 消费者消费物品
q.pop();
cout << "Consumer consumed " << x << endl;
this_thread::sleep_for(chrono::milliseconds(1000)); // 睡眠1000毫秒
}
}
int main() {
thread t1(producer);
thread t2(consumer);
t1.join();
t2.join();
return 0;
}
```
在这段代码中,生产者和消费者共享一个队列 `q` ,通过互斥锁 `mtx` 来保证线程安全。生产者使用 `unique_lock` 加锁,生产物品后唤醒等待的线程。消费者使用 `unique_lock` 加锁,当队列为空时等待,等待到有物品时消费。条件变量 `cv` 用于线程同步,当有新的物品生产或者物品被消费时,唤醒等待的线程。
阅读全文