用C++11编写一个单生产者单消费者模型
时间: 2023-08-21 09:04:15 浏览: 60
单生产者单消费者模型是指在一个线程中进行生产和消费,可以用一个队列来实现。
以下是一个使用C++11的单生产者单消费者模型的示例代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
using namespace std;
// 生产者线程函数
void producer(thread::id tid, queue<int>& q, mutex& mtx, condition_variable& cv)
{
for (int i = 0; i < 10; ++i) {
// 生产一个数并加入队列
int num = rand() % 100;
unique_lock<mutex> lock(mtx);
q.push(num);
cout << "producer[" << tid << "] produced: " << num << endl;
lock.unlock();
cv.notify_one(); // 通知消费者线程
this_thread::sleep_for(chrono::milliseconds(200));
}
}
// 消费者线程函数
void consumer(thread::id tid, queue<int>& q, mutex& mtx, condition_variable& cv)
{
while (true) {
unique_lock<mutex> lock(mtx);
// 如果队列为空,则等待生产者线程生产数据
cv.wait(lock, [&q]() { return !q.empty(); });
// 取出队首元素并消费
int num = q.front();
q.pop();
cout << "consumer[" << tid << "] consumed: " << num << endl;
lock.unlock();
this_thread::sleep_for(chrono::milliseconds(500));
}
}
int main()
{
queue<int> q;
mutex mtx;
condition_variable cv;
thread producer_thread(producer, this_thread::get_id(), ref(q), ref(mtx), ref(cv));
thread consumer_thread(consumer, this_thread::get_id(), ref(q), ref(mtx), ref(cv));
producer_thread.join();
consumer_thread.join();
return 0;
}
```
在该示例代码中,生产者线程使用了rand()函数生成一个随机数,并将其加入队列中。然后使用unique_lock对互斥量进行加锁,通知消费者线程可以开始消费。消费者线程使用condition_variable对队列进行等待,如果队列为空则等待生产者线程生产数据。如果队列非空,则取出队首元素并进行消费。生产者和消费者线程都使用this_thread::sleep_for函数进行暂停,以便观察效果。