c++11中condition_variable信号量的标准用法。
2015-12-07 13:24
471 查看
目标:主线程向其它线程发生消息,其它线程收到消息并处理。
伪代码目标:主线程将消息加入listTemp链表,使用condition_variable的notify_one通知线程,其它线程将消息处理,并将消息加入到已处理listTemp2链表中。
伪代码
代码保证消息不会有遗漏,并且所有消息都能得到处理。但是并不保证,已处理的消息链表中的顺序与加入消息的顺序一致。
伪代码目标:主线程将消息加入listTemp链表,使用condition_variable的notify_one通知线程,其它线程将消息处理,并将消息加入到已处理listTemp2链表中。
伪代码
#include <atomic> #include <mutex> #include <list> #include <vector> #include <thread> #include <cassert> int main() { std::atomic<int> nNum = ATOMIC_VAR_INIT(0); std::mutex listMu; std::list<int> listTemp; std::mutex listMu2; std::list<int> listTemp2; std::condition_variable listCondition; std::vector<std::shared_ptr < std::thread >> listThread; int const nMax = 1000; for (int i = 0; i != 10; ++i) { auto pTh = std::make_shared <std::thread>([&listTemp,&listCondition,&listMu,&nNum,&listTemp2,&listMu2,nMax] ()->void { while (true) { int i = -1; { std::unique_lock<std::mutex> lc(listMu); while (listTemp.empty()) { listCondition.wait(lc); { std::lock_guard<std::mutex> lc(listMu2); if (listTemp2.size() == nMax) { break; } } } { std::lock_guard<std::mutex> lc(listMu2); if (listTemp2.size() == nMax) { listCondition.notify_one(); break; } } i = *listTemp.begin(); listTemp.erase(listTemp.begin()); } //处理比较耗时的操作 { std::lock_guard<std::mutex> lc(listMu2); listTemp2.push_back(i); if (listTemp2.size() == nMax) { listCondition.notify_one(); break; } } std::this_thread::sleep_for(std::chrono::milliseconds(100)); } }); listThread.push_back(pTh); } for (int i = 0; i != nMax; ++i) { { std::lock_guard<std::mutex> lc(listMu); listTemp.push_back(i); listCondition.notify_one(); } std::this_thread::sleep_for(std::chrono::milliseconds(15)); } //listCondition.notify_all(); for (auto t : listThread) { t->join(); } assert(nMax == listTemp2); std::cout << "结束" << std::endl; getchar(); return 0; }
代码保证消息不会有遗漏,并且所有消息都能得到处理。但是并不保证,已处理的消息链表中的顺序与加入消息的顺序一致。
相关文章推荐
- 集合的基本运算: 依据集合运算规则,实现任意给定两个集合的交、并、差、笛卡儿积运算,和第一个集合的幂集,并显示运算结果。
- 值得推荐的C/C++框架和库
- C++强制类型转换
- C++随机数
- c语言总结
- Cpp--string中npos
- leetcode 313 : Super Ugly Number
- Strategy(策略)设计模式
- 从masonry中学到的c++and关键字
- C语言_指针
- const和typedef一起使用
- 设计模式系列(八)单例模式(Singleton Pattern)
- C++调用时间模块
- C语言中的static 详细分析
- 用Visual C++.NET进行GDI+编程
- c++_3: 继承和组合
- C语言 时间戳和标准格式的转换
- 谈C++内存管理与智能指针
- 常用C/C++预处理指令详解
- c++ std::function作为参数传入函数