1. 程式人生 > 其它 >c++多執行緒 喚醒notify_one/notify_all 必須發生在阻塞之前才是 有效喚醒

c++多執行緒 喚醒notify_one/notify_all 必須發生在阻塞之前才是 有效喚醒

技術標籤:c/c++C++先阻塞先喚醒

如果執行緒 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; }