簡體   English   中英

在調用 std::condition_variable::wait() 之前多次調用 std::condition_variable::notify_one()

[英]Calling std::condition_variable::notify_one() multiple times before std::condition_variable::wait() is called

我正在努力理解std::condition_variable的使用方式。 假設我有 Producer 和 Consumer 線程,並且兩者都在相同的condition_variable上運行。 Producer 填充數據以非常快地處理並在每次將數據推送到容器時調用std::condition_variable::notify_one() 因此,假設生產者推送了 10 個項目並在消費者可以處理首先添加的數據之前調用了notify_one() 10 次。 現在生產者線程退出,所以它不會再調用nootify_one()那么等待condition_variable消費者線程會發生什么? 之前對notify_one() 9 次調用是否會排隊並且消費者將被解鎖 9 次以上?

cppreference

如果有任何線程正在等待 *this ,則調用 notify_one 會解除對等待線程之一的阻塞。

問題是,這應該無關緊要。 任何使用 condition_variable 的消費者都必須檢查是否允許他們繼續,即是否有任何可用數據。 在您描述的情況下,他們會發現存在,因此他們不會被暫停,也不需要通知。

或者,換句話說,當沒有數據可用時,它們將被掛起,並且只有在生產者添加新數據並使用任何掛起的消費者調用notify_one后才會喚醒。

condition_variable::notify_one()condition_variable::notify_all()記錄它們被調用的次數。 它們適用於調用時正在等待的任何線程。 稍后等待條件變量的線程不受先前調用的影響。 由程序來跟蹤是否有任何待處理的工作。

這就是從循環中調用wait()的原因:

while (no_data_ready())
    myvar.wait();

也就是說,只有在無事可做時才等待。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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