Условные переменные - PullRequest
       18

Условные переменные

3 голосов
/ 19 апреля 2011

Я заметил, что когда я выполняю операцию ожидания над условной переменной, она немедленно возвращается.Следствием этого является то, что при выполнении следующего фиктивного кода в цикле используется 100% одного ЦП:

int main(void) {

boost::condition_variable cond;
boost::mutex mut;
bool data_ready = false;

boost::unique_lock<boost::mutex> lock(mut);
while (!data_ready) {
    cond.wait(lock);
}


return 1;

}

Я ожидаю, что вызов cond.wait(lock)поместите поток в состояние, когда он не потребляет процессор, но это не так.

Так в чем же проблема?Я взял приведенный выше код из документации надстройки.

(я использую надстройку 1.44)

Спасибо,

Гийом

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

A condition_variable::wait может возвращаться реже . То есть без уведомления. То, как часто он возвращается, является вопросом качества реализации.

На моей машине я взял ваш код, изменил его на std :: condition_variable (новое в C ++ 11) и запустил его. Он висел без процессора.

Звучит как реализация boost на вашей платформе (boost имеет разные реализации для windows и pthreads), как будто пробуждается, чтобы убедиться, что не пропустит уведомление.

1 голос
/ 19 апреля 2011

Поскольку в программе нет других потоков, библиотека потоков может сразу же вернуться из pthread_cond_wait (), иначе ваша программа будет спать вечно.

...