[英]How to fix race condition for condition variable wait/notify
這個問題的答案是錯誤的,因為它有可能陷入僵局。 條件變量-等待/通知比賽條件
我找不到解決競賽條件或死鎖問題的解決方案。
想象我們有兩個線程。 現在的目標如下。
first condition:
Thread 1 Waits
Thread 2 Notifies
second condition:
Thread 2 Notifies
Thread 1 Should not wait and continue normal execution.
如何在沒有通知隊列的情況下正確實現呢? 因為我希望這部分代碼盡可能快地運行,並使用布爾值而不是將項目添加到隊列中。 而且只有2個線程,所以對我來說使用隊列似乎有些過頭了。
存在競爭條件時的偽代碼:
Thread 1:
lock(x);
if(!signaled)
{
unlock(x); // ********
// still small gap, how to avoid?
cv.wait(); // forget spurious wakeup for sake of simplicity
signaled = false;
}
else // ********
unlock(x);
Thread 2:
lock(x);
signaled = true;
cv.notify();
unlock(x);
現在,如果您刪除帶有注釋的兩行,則********
競爭條件將得到解決,並且死鎖的可能性將被引入,其中線程1在擁有鎖的同時等待,而線程2卡在鎖定x處。
混淆的根源是對條件變量的誤解。 它們的固有特征是鎖釋放和進入等待模式是原子完成的,即在兩者之間什么也沒有發生。
因此,在變量進入等待模式之前不會對變量進行任何修改,因為不會釋放鎖定。 這是任何符合conditional_variable
實現的基本保證,例如,以下是std::conditional_variable
的參考頁摘錄:
http://en.cppreference.com/w/cpp/thread/condition_variable/wait
以原子方式釋放鎖,阻塞當前正在執行的線程,並將其添加到等待* this的線程列表中。 執行notify_all()或notify_one()時,該線程將被解除阻塞。 它也可能會被虛假地阻止。 解除阻止后,無論出於何種原因,都將重新獲得鎖定並等待退出。 如果此函數通過異常退出,則也將重新獲得鎖定。 (直到C ++ 14)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.