在不鎖定互斥鎖的情況下調用pthread_cond_signal:不可靠的喚醒
與常見的誤解相反,在不獲取互獲取互通性斥鎖的情況下呼叫pthread_cond_signal 或pthread_cond_broadcast可能會導致錯過喚醒喚醒,危及執行緒
為什麼互斥鎖定至關重要
pthread_cond_signal 函式通知等待執行緒關聯的條件已更改。但是,如果保護與條件相關的共享資料的互斥體未鎖定,則可能會發生競爭條件。
考慮這樣一種情況:一個執行緒 (A) 正在等待條件變量,而另一個執行緒 (B) ) 將條件設為 true 並呼叫 pthread_cond_signal。如果沒有互斥鎖,執行緒 B 可能會在執行緒 A 仍在檢查條件且尚未進入 pthread_cond_wait 呼叫時發出訊號。
錯過喚醒的風險
由於這種競爭條件,執行緒 A 可能會錯過喚醒訊號並無限期地保持等待。當線程 A 正在實現關鍵部分並需要及時通知共享資料的變更時,這種情況尤其成問題。
正確的同步模式
確保可靠的喚醒,應嚴格遵循以下同步模式:
pthread_mutex_lock(&mutex); // Change shared data pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex);
執行緒B 僅應在取得互斥體並更改共享資料後發出訊號,確保任何掛起的喚醒都將由執行緒A 接收。
結論
鎖定 pthread_cond_signal 呼叫周圍的互斥體對於保護執行緒同步和防止錯過喚醒至關重要。如果不這樣做,可能會導致不可預測的、潛在災難性的競爭狀況。
以上是為什麼在沒有互斥鎖的情況下呼叫「pthread_cond_signal」會導致不可靠的喚醒?的詳細內容。更多資訊請關注PHP中文網其他相關文章!