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