我想知道一个线程什么时候从一个条件中醒来 我在消费者线程上有这样的东西
std::lock_guard<std::mutex> guard(mmutex);
vector.push_back(s);
cv.notify_one();
这是生产者线程
cv.wait(guard, [this]{ return this->checkcondition(); } );
现在我的问题在声明中
string[,] testString = new string[100, 32766]; //Replace this with your Initialisation / existing string
var arrayRank = (int)Math.Round((double) 100000 / 32767, 0);
var arrayIndex = (int)Math.Round((double)100000 % 32767, 0);
//Test this works.
//testString[arrayRank, arrayIndex] = "test"; - Test to see that the array range is assignable.
var result = testString[arrayRank, arrayIndex]; //Test value is what we expect
如果checkcondition()返回false导致.wait进入睡眠状态(阻塞)。 什么时候.wait再次检查谓词??
答案 0 :(得分:4)
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()
被调用的事件。
答案 1 :(得分:2)
当您致电cv.notify_one
时,等待线程(等待线程的一个,如果有多个)将被唤醒。
刚刚醒来的线程将锁定互斥锁并调用this->checkcondition()
。如果返回true,则返回wait
。否则,它将再次解锁互斥锁并重新进入睡眠状态。