C++11之生产者消费者

来源:互联网 发布:奶油知多少 编辑:程序博客网 时间:2024/05/19 00:54
#include <mutex>#include <condition_variable>#include <deque>#include <iostream>using namespace std;// 定义两个条件变量//  队列未满std::condition_variableQueueNotFull;// 队列不空std::condition_variableQueueNotEmpty;// 队列锁std::mutexQueueMutex;// 队列std::deque<int>Que;enum{// 队列的最大容量MaxSize = 16};// 判断队列是否为空boolEmpty(){return Que.empty();}// 判断队列是否已满boolFull(){return Que.size() == MaxSize;}// 往队列中添加数据voidPut(int element){// 加锁std::unique_lock<std::mutex> locker(QueueMutex);// 如果队列已经满了,那么等待while (Full()){cout << "Full !! Wait !!" << endl;QueueNotFull.wait(locker);}Que.push_back(element);// 通知其他线程,队列不空QueueNotEmpty.notify_all();}// 从队列中取出数据intGet(){// 加锁std::unique_lock<std::mutex> locker(QueueMutex);// 如果队列为空,那么等待while (Empty()){cout << "Empty!! Wait!!" << endl;QueueNotEmpty.wait(locker);}int t = Que.front();Que.pop_front();// 通知其他等待的对象,队列不满QueueNotFull.notify_all();return t;}// 消费者线程void GetFunc(){while (1){int var;var = Get();cout << "Get : " << var << endl;}}// 生产者线程void PutFunc(){srand((unsigned int)time(0));while (1){int var = rand()%100;Put(var);}}int main(int arc,char** argv){// 启动两个线程std::thread td1(GetFunc);std::thread td2(PutFunc);td1.join();td2.join();return 0;}

0 0
原创粉丝点击