Я читал это
хороший блог от A Williams:
http://www.justsoftwaresolutions.co.uk/threading/condition-variable-spurious-wakes.html
и меня беспокоит одна вещь:
когда поток просыпается из-за ложного пробуждения, блокируется ли мьютекс?
boost::mutex::scoped_lock lock(the_mutex);
while(the_queue.empty())
{
the_condition_variable.wait(lock);
}
Я думаю, потому что в противном случае вызов .empty будет небезопасным, но я не уверен.
Да, мьютекс заблокирован. По сути, мьютекс освобождается только тогда, когда поток заблокирован в the_condition_variable.wait()
, Ложное пробуждение или нет, мьютекс заблокирован везде в коде, который вы показываете.
От документация за boost::condition_variable::wait()
:
Постусловие:
lock
заблокирован текущим потоком.
Других решений пока нет …