用Visual Studio实现生产者消费者问题
时间: 2024-01-10 22:04:16 浏览: 129
生产者消费者问题是一个经典的线程同步问题,可以用多种方式实现。以下是使用C++和Visual Studio实现的一种方式:
```cpp
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
const int MAX_SIZE = 10; // 缓冲区最大容量
queue<int> buffer; // 缓冲区
mutex mtx; // 互斥锁
condition_variable not_full; // 缓冲区不满的条件变量
condition_variable not_empty; // 缓冲区不空的条件变量
// 生产者线程函数
void producer(int id)
{
for (int i = 1; i <= 20; i++) {
unique_lock<mutex> lck(mtx);
// 如果缓冲区已满,则等待
not_full.wait(lck, [] { return buffer.size() < MAX_SIZE; });
buffer.push(i);
cout << "producer " << id << " produced " << i << endl;
not_empty.notify_one(); // 通知消费者线程缓冲区不空
}
}
// 消费者线程函数
void consumer(int id)
{
int data;
while (true) {
unique_lock<mutex> lck(mtx);
// 如果缓冲区已空,则等待
not_empty.wait(lck, [] { return !buffer.empty(); });
data = buffer.front();
buffer.pop();
cout << "consumer " << id << " consumed " << data << endl;
not_full.notify_one(); // 通知生产者线程缓冲区不满
if (data == 20) // 如果消费者消费到了最后一个数据,则退出线程
break;
}
}
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;
}
```
上述代码中,将缓冲区实现为一个队列,使用互斥锁保护缓冲区的访问,使用条件变量实现生产者和消费者的同步。生产者线程在生产数据之前会检查缓冲区是否已满,如果已满则等待;生产数据后将数据压入缓冲区,并通知消费者线程缓冲区不空。消费者线程在消费数据之前会检查缓冲区是否已空,如果已空则等待;消费数据后将数据弹出缓冲区,并通知生产者线程缓冲区不满。最后在主线程中等待所有线程结束。
阅读全文