簡體   English   中英

線程何時從condition.wait()中喚醒

[英]when does a thread wake up from condition.wait()

我想知道線程何時從條件中喚醒,消費者線程上有類似的內容

while(true)
                {
                    std::unique_lock<std::mutex> guard(mmutex);
                    cv.wait(guard, [this]{ return this->checkcondition(); } ); //sleeps when does this wake up
                    if(vector.size()>0) 
                    {
                       ....
                    }
                }

這是生產者線程

std::lock_guard<std::mutex> guard(mmutex);
vector.push_back(s);
cv.notify_one();

現在我的問題在聲明中

cv.wait(guard, [this]{ return this->checkcondition(); } );

如果checkcondition()返回false導致.wait進入睡眠(阻止)狀態。 .wait什么時候再次檢查謂詞?

C ++ 11 30.5.1“ class condition_variable類”說明了可以依靠的行為。 有3件事將解除阻塞condition_variable::wait()調用內阻塞的線程。 該函數將解除阻止:

  • 當通過調用notify_one()發出信號時
  • 當通過調用notify_all()發出信號時
  • 虛假地

在帶有謂詞的wait()調用中,編譯器生成的代碼類似於:

while (!pred())
    wait(lock);

因此,如果謂詞返回false (或等效值),則將再次調用wait() 在前面提到的三件事之一再次發生之前,它不會再次解除阻止。

通常,謂詞應“匹配”導致notify_one()notify_all()被調用的事件。

當您調用cv.notify_one ,等待線程( 一個等待線程,如果有多個)將被喚醒。

剛醒來的線程將鎖定互斥鎖並調用this->checkcondition() 如果返回true,它將從wait返回。 否則,它將再次解鎖互斥鎖並返回睡眠狀態。

暫無
暫無

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

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