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
原创粉丝点击