多生产者消费者问题c++
时间: 2023-11-03 20:07:21 浏览: 154
多生产者消费者问题是一个经典的并发编程问题,即多个生产者线程同时向一个共享的缓冲区中生产数据,多个消费者线程同时从缓冲区中消费数据。以下是一个使用C++语言实现的多生产者消费者问题的示例代码:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
using namespace std;
const int BUFFER_SIZE = 10;
queue<int> buffer;
mutex mtx;
condition_variable not_full;
condition_variable not_empty;
void producer(int id) {
while (true) {
unique_lock<mutex> lock(mtx);
while (buffer.size() == BUFFER_SIZE) {
not_full.wait(lock);
}
int item = rand() % 100;
buffer.push(item);
cout << "Producer " << id << " produces item " << item << endl;
not_empty.notify_all();
}
}
void consumer(int id) {
while (true) {
unique_lock<mutex> lock(mtx);
while (buffer.empty()) {
not_empty.wait(lock);
}
int item = buffer.front();
buffer.pop();
cout << "Consumer " << id << " consumes item " << item << endl;
not_full.notify_all();
}
}
int main() {
thread p1(producer, 1);
thread p2(producer, 2);
thread c1(consumer, 1);
thread c2(consumer, 2);
p1.join();
p2.join();
c1.join();
c2.join();
return 0;
}
```
在上面的代码中,我们使用了一个互斥量`mtx`来保证对共享缓冲区的访问是线程安全的。当缓冲区满时,生产者线程会调用`not_full.wait(lock)`等待缓冲区非满;当缓冲区为空时,消费者线程会调用`not_empty.wait(lock)`等待缓冲区非空。当生产者线程向缓冲区中添加数据后,会通过`not_empty.notify_all()`通知所有等待的消费者线程;当消费者线程从缓冲区中取出数据后,会通过`not_full.notify_all()`通知所有等待的生产者线程。
阅读全文