c++11多執行緒中的condition_variable(生產者消費者示例)
阿新 • • 發佈:2019-06-14
#include <iostream> #include <string> #include <thread> #include <list> #include <mutex> #include <condition_variable> class MesProcess { public: void Inmsglist() { for (int i = 0; i < 10; i++) { std::unique_lock<std::mutex> uniqlock(my_mutex); std::cout << "Inmsglist執行緒正在執行,插入數字為:" << i << std::endl; msglist.push_back(i); my_cond.notify_one(); //嘗試把wait和執行緒喚醒,執行完這裡wait就會被喚醒 //如果新增執行緒Outmsg_thread2則需要將此處更換為notify_all更穩定 } std::cout<<"in over"<<std::endl; in_thread_exit = true; } void Outmsglist() { int command = 0; while (true) { std::unique_lock < std::mutex > uniqlock(my_mutex); // my_cond.wait(uniqlock, [this] { //這裡的判斷條件為lambda表示式,判斷資訊佇列是否為空,為空返回false,否則返回true // if (!msglist.empty()) //呼叫wait函式 // return true; // return false; // }); my_cond.wait_for(uniqlock, std::chrono::milliseconds(10), [this]{ if (!msglist.empty()) //呼叫wait_for函式 return true; return false; }); if(in_thread_exit && msglist.empty()){ std::cout<<"out over"<<std::endl; break; } command = msglist.front(); msglist.pop_front(); std::cout << "Outmsglist執行緒"<<" 正在執行,取出數字為:" << command << std::endl; uniqlock.unlock(); } } private: std::list<int> msglist; std::mutex my_mutex; std::condition_variable my_cond; //生成一個條件變數物件 bool in_thread_exit = false; }; int main() { // std::cout << "主執行緒的執行緒id為: " << std::this_thread::get_id() << std::endl; MesProcess mpobj; std::thread Outmsg_thread(&MesProcess::Outmsglist, &mpobj); //std::thread Outmsg_thread2(&MesProcess::Outmsglist, &mpobj); std::thread Inmsg_thread(&MesProcess::Inmsglist, &mpobj); Inmsg_thread.join(); Outmsg_thread.join(); //Outmsg_thread2.join(); std::cout << "主執行緒執行結束" << std::endl; return 0; }
執行結果:
Inmsglist執行緒正在執行,插入數字為:0 Inmsglist執行緒正在執行,插入數字為:1 Inmsglist執行緒正在執行,插入數字為:2 Inmsglist執行緒正在執行,插入數字為:3 Outmsglist執行緒 正在執行,取出數字為:0 Outmsglist執行緒 正在執行,取出數字為:1 Outmsglist執行緒 正在執行,取出數字為:2 Outmsglist執行緒 正在執行,取出數字為:3 Inmsglist執行緒正在執行,插入數字為:4 Inmsglist執行緒正在執行,插入數字為:5 Inmsglist執行緒正在執行,插入數字為:6 Inmsglist執行緒正在執行,插入數字為:7 Inmsglist執行緒正在執行,插入數字為:8 Inmsglist執行緒正在執行,插入數字為:9 in over Outmsglist執行緒 正在執行,取出數字為:4 Outmsglist執行緒 正在執行,取出數字為:5 Outmsglist執行緒 正在執行,取出數字為:6 Outmsglist執行緒 正在執行,取出數字為:7 Outmsglist執行緒 正在執行,取出數字為:8 Outmsglist執行緒 正在執行,取出數字為:9 out over 主執行緒執行結束