conditional_variable "ложные" пробуждения - PullRequest
0 голосов
/ 25 апреля 2018

У меня проблемы с пониманием conditional_variable wait_for .

Пример программы:

#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>

std::mutex m;
std::condition_variable cv;
bool ready = false;

using namespace std;

void worker_thread()
{
    std::unique_lock<std::mutex> lk(m);

    for (int i=0; i<3; i++) {
      auto remaining = chrono::milliseconds::max();

      std::cout << "Going to sleep for " << remaining.count() << endl;
      bool r = cv.wait_for(lk, remaining, [] () { return ready;});
      std::cout << "Wakey wakey " << r << endl;
    }

    std::cout << "Thread finished" << endl;
}

int main()
{
    std::thread worker(worker_thread);
    worker.join();
}

Что я ожидаю от этой программы:

  • Иди спать вечно, так как я никогда не устанавливал ready в истину и не вызывал cv.notify_one()

Что он на самом деле делает:

Going to sleep for 9223372036854775807
Wakey wakey 0
Going to sleep for 9223372036854775807
Wakey wakey 0
Going to sleep for 9223372036854775807
Wakey wakey 0
Thread finished

Это из-за "ложных пробуждений"? Но я использовал перегрузку (2), которая в документации гласит: This overload may be used to ignore spurious awakenings.

Выполните код здесь: https://repl.it/repls/EnchantedFatalUnderstanding

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...