请帮我写一个生产者-消费者同步与互斥的C++代码 不使用thread
时间: 2024-02-28 11:54:48 浏览: 29
好的,以下是一个简单的生产者-消费者同步与互斥的C++代码,使用了互斥锁和条件变量来实现同步:
```c++
#include <iostream>
#include <queue>
#include <mutex>
#include <condition_variable>
using namespace std;
// 定义一个全局的队列
queue<int> q;
// 定义互斥锁和条件变量
mutex mtx;
condition_variable cv;
// 生产者函数
void producer() {
for (int i = 0; i < 10; i++) {
// 加锁
unique_lock<mutex> lock(mtx);
// 如果队列已满,等待消费者消费
while (q.size() == 10) {
cv.wait(lock);
}
// 生产一个数据并加入队列
q.push(i);
cout << "Producer produced " << i << endl;
// 通知消费者
cv.notify_all();
}
}
// 消费者函数
void consumer() {
for (int i = 0; i < 10; i++) {
// 加锁
unique_lock<mutex> lock(mtx);
// 如果队列为空,等待生产者生产
while (q.empty()) {
cv.wait(lock);
}
// 从队列中取出一个数据并消费
int data = q.front();
q.pop();
cout << "Consumer consumed " << data << endl;
// 通知生产者
cv.notify_all();
}
}
int main() {
// 创建生产者和消费者线程
thread prod(producer);
thread cons(consumer);
// 等待线程结束
prod.join();
cons.join();
return 0;
}
```
在以上代码中,我们创建了一个全局的队列 `q`,并定义了互斥锁 `mtx` 和条件变量 `cv`。生产者函数 `producer` 会不断往队列中添加数据,如果队列已满,则等待消费者消费;消费者函数 `consumer` 会不断从队列中取出数据进行消费,如果队列为空,则等待生产者生产。在每次添加或取出数据后,我们使用 `cv.notify_all()` 来通知其他线程进行操作。
使用互斥锁和条件变量可以有效地实现生产者-消费者同步与互斥。