生产者-消费者,使用C++11的版本
来源:互联网 发布:中国程序员大神 编辑:程序博客网 时间:2024/06/05 03:19
前言
multi-threading以及lambda是C++11的重要升级,下面的经典的生产者-消费者的代码,既使用了C++11的multi-threading相关的库, 又使用了lambda。代码中有注释,应该比较详细。
Talk is cheap show me the code
#include <iostream> #include <queue>#include <thread> #include <mutex> #include <condition_variable> using namespace std;mutex mtx;condition_variable produce, consume;queue<int> q; // shared value by producers and consumers, which is the critical sectionint maxSize = 20;void consumer() { while (true) { this_thread::sleep_for(chrono::milliseconds(1000)); unique_lock<mutex> lck(mtx); // RAII,程序运行到此block的外面(进入下一个while循环之前),资源(内存)自动释放 consume.wait(lck, [] {return q.size() != 0; }); // wait(block) consumer when q.size() == 0 cout << "consumer " << this_thread::get_id() << ": "; q.pop(); cout << q.size() << '\n'; produce.notify_all(); // nodity(wake up) producer when q.size() != maxSize }}void producer(int id){ while (true) { this_thread::sleep_for(chrono::milliseconds(900)); // producer is a little faster than consumer unique_lock<mutex> lck(mtx); produce.wait(lck, [] {return q.size() != maxSize; }); // wait(block) producer when q.size() == maxSize cout << "-> producer " << this_thread::get_id() << ": "; q.push(id); cout << q.size() << '\n'; consume.notify_all(); // notify(wake up) consumer when q.size() != 0 }}int main(){ thread consumers[2], producers[2]; // spawn 2 consumers and 2 producers: for (int i = 0; i < 2; ++i) { consumers[i] = thread(consumer); producers[i] = thread(producer, i + 1); } // join them back: (in this program, never join...) for (int i = 0; i < 2; ++i) { producers[i].join(); consumers[i].join(); } system("pause"); return 0;}
生产者-消费者模型扩展
我的GitHub里的一个项目:线程池(使用C++11)
1 0
- 生产者-消费者,使用C++11的版本
- 实现一个通用的生产者消费者队列(c语言版本)
- 生产者-消费者 C的简单模拟
- 生产者消费者---C实现
- c 生产者与消费者
- zthread的使用9:生产者和消费者
- 使用信号量的生产者-消费者问题
- 使用Java的BlockingQueue实现生产者-消费者
- 使用Java的BlockingQueue实现生产者-消费者
- 使用Condition的生产者消费者模式
- 使用Java的BlockingQueue实现生产者-消费者
- 使用信号量的生产者—消费者问题
- 使用Java的BlockingQueue实现生产者-消费者
- 生产者消费者模式的使用分析
- 使用Lock的Condition实现生产者消费者
- 使用Java的BlockingQueue实现生产者-消费者
- 使用Java的BlockingQueue实现生产者-消费者
- javaAPI使用kafka0.11,生产者与消费者
- hdu 5773 The All-purpose Zero
- Xcode关于Framework问题处理的经验分享
- Zero ICE demo
- Android Studio 包冲突的解决方法
- Base64 Encode 1x1px透明GIF图片
- 生产者-消费者,使用C++11的版本
- 中文分词正确与否的评价标准本质是什么?
- EasyUI 验证框
- iOS原生App与H5页面交互笔记
- 自定义代理
- ContentProvider 和ContentResolver内容提供者和内容解析者
- YII 如何使用MemCache缓存
- Activity生命周期总结
- ubuntu 14.04 部署 Django1.9