用c++编程实现生产者消费者问题
时间: 2024-02-28 13:57:08 浏览: 93
生产者消费者问题是一个经典的并发编程问题,可以使用多种编程语言实现。下面是使用 C++ 实现生产者消费者问题的示例代码:
```c++
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
const int kMaxSize = 10; // 缓冲区最大容量
queue<int> buffer; // 缓冲区
mutex mtx; // 互斥锁,保护缓冲区
condition_variable not_full_cv, not_empty_cv; // 条件变量,用于线程同步
void producer() {
for (int i = 1; i <= 20; ++i) {
unique_lock<mutex> lock(mtx);
not_full_cv.wait(lock, [] { return buffer.size() < kMaxSize; }); // 等待缓冲区未满
buffer.push(i);
cout << "producer: " << i << endl;
not_empty_cv.notify_all(); // 通知消费者线程缓冲区不为空
}
}
void consumer() {
int data = 0;
while (data != 20) {
unique_lock<mutex> lock(mtx);
not_empty_cv.wait(lock, [] { return !buffer.empty(); }); // 等待缓冲区不为空
data = buffer.front();
buffer.pop();
cout << "consumer: " << data << endl;
not_full_cv.notify_all(); // 通知生产者线程缓冲区未满
}
}
int main() {
thread prod(producer);
thread cons(consumer);
prod.join();
cons.join();
return 0;
}
```
这个程序中,生产者线程不断向缓冲区中生产数据,消费者线程不断从缓冲区中消费数据,直到生产者线程生产完数据并退出。在程序中,使用互斥锁保护了缓冲区,防止多个线程同时访问,使用条件变量实现了线程同步。`not_full_cv` 条件变量用于通知生产者线程缓冲区未满,`not_empty_cv` 条件变量用于通知消费者线程缓冲区不为空。在生产者线程和消费者线程中,使用 `wait` 函数等待条件变量满足,当条件变量满足时再执行相应的操作,并使用 `notify_all` 函数通知其他线程条件变量已经满足,可以继续执行。
阅读全文