c++11中condition_variable信号量的标准用法。
来源:互联网 发布:java future get 阻塞 编辑:程序博客网 时间:2024/06/18 11:07
目标:主线程向其它线程发生消息,其它线程收到消息并处理。
伪代码目标:主线程将消息加入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;}
代码保证消息不会有遗漏,并且所有消息都能得到处理。但是并不保证,已处理的消息链表中的顺序与加入消息的顺序一致。
0 0
- c++11中condition_variable信号量的标准用法。
- C++11中std::condition_variable的使用
- 条件变量的用法:CONDITION_VARIABLE
- C 中标准库函数 qsort 的用法
- 标准C函数库的用法
- c++11条件变量的使用,condition_variable
- c标准库中qsort函数用法
- boost::condition_variable的使用
- Linux信号量的用法
- vxworks 信号量的用法
- 信号量dispatch_semaphore的用法
- C++11 std::condition_variable
- C标准库的setlocale()用法笔记
- C 标准库的 setlocale() 函数用法
- C标准库的setlocale()用法笔记
- C标准库的setlocale()用法笔记
- C标准库的setlocale()用法笔记
- C标准库的setlocale()用法笔记
- heat template: get_param to get value from JSON param.
- LeetCode(173) Binary Search Tree Iterator
- 对话框
- linux网络编程实现投票功能
- Linux 网络编程 简单实例
- c++11中condition_variable信号量的标准用法。
- 71,类的继承性
- Linux网络编程--多线程实现echo服务器与客户端“一对多”功能,网络编程的“Hello World!” - 壮壮熊
- PHP curl 可以模仿用户登录,还可以模仿用户IP地址、伪造IP来源
- 【bzoj2927】[Poi1999] 多边形之战
- 斯坦福大学Andrew Ng教授主讲的《机器学习》公开课观后感
- Linux启动过程中几个重要配置文件的执行过程
- Linux环境下网络编程杂谈
- wamp server多站点配置