簡體   English   中英

如何為條件變量等待/通知修復競爭條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM