什么时候从condition.wait()唤醒一个线程

时间:2016-03-16 04:17:50

标签: c++ multithreading

我想知道一个线程什么时候从一个条件中醒来 我在消费者线程上有这样的东西

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再次检查谓词??

2 个答案:

答案 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。否则,它将再次解锁互斥锁并重新进入睡眠状态。