c++多執行緒 喚醒notify_one/notify_all 必須發生在阻塞之前才是 有效喚醒
阿新 • • 發佈:2020-12-25
如果執行緒 t 還沒在條件變數 cv 上阻塞,此時在條件變數 cv 上進行喚醒操作,該喚醒操作首先顯然對執行緒 t 現在不會有影響,同時也不會對之後執行緒 t 在條件變數 cv 上阻塞有影響。
效果
測試程式碼
#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>
#include <chrono>
using namespace std;
bool flag = false;
mutex mtx;
condition_variable cv;
void f() {// 子執行緒程式碼
cout << "f started " << endl;
this_thread::sleep_for(chrono::milliseconds(1000)); // 故意讓主執行緒中的 notify_one 喚醒操作先執行
unique_lock<mutex> lck(mtx);
cv.wait(lck);
cout << "f finished " << endl;
return;
}
int main()
{
thread t(f);
cv.notify_one();// 喚醒一個等待 cv 這個條件變數上的的執行緒
t.join();// 主執行緒等待子執行緒執行結束
cout << "Hello World" << endl;
return 0;
}