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