2014-01-12 3 views
0

У меня есть следующий код: где m_event является повышение :: condition_variableПочему я должен иметь boost :: mutex для boost :: condition_variable?

 boost::scoped_lock dummy; 
     boost::unique_lock<boost::scoped_lock> lock(dummy); // TODO: see if dummy is correct 
     m_event.wait(lock, [this]() { 
      return !this ->m_enqueue.empty(); 
     }); 

Я действительно не нужно, что кукла шкафчик я просто хочу, чтобы событие, чтобы остановить на определенное логическое условие, я не понять что-то?

Почему я вынужден использовать фиктивный замок?

(PS код работает отлично ..)

EDIT: На самом деле, если я правильно понял, что у меня есть в моем классе является повышение :: мьютекс, давайте назовем это m_mtx и очевидные Inserters к m_enqueue .. поэтому я меняю осуществление соответственно к замку, чтобы зафиксировать на m_lock, а затем Inserters бы только сделать:

boost::mutex::scoped_lock<boost::mutex> guard(m_lock); 

имеет смысл?

+0

См. [Этот предыдущий ответ] (http://stackoverflow.com/questions/13099660/c11-why-does-stdcondition-variable-use-stdunique -lock) –

+0

@ichramm: Это вопрос! И [это немного отличается] (http://stackoverflow.com/questions/13099660/c11-why-does-stdcondition-variable-use-stdunique-lock#comment17804829_13099660), при этом ... –

ответ

0

timed_wait ожидает получения блокировки, если это произойдет вовремя.

Без блокировки он ничего не может сделать.

Мне кажется, вы злоупотребляете timed_wait.

+0

Недавно добавлено timed_wait и не выпущен, тот же вопрос для ожидания – Alon

+0

Что значит «не имеет значения»? Ваш вопрос об этом, не так ли? –

+0

нет, поэтому я должен использовать фиктивный мьютекс, если вы удалите тайм-аут все вместе, вопрос останется, я отредактирую – Alon

Смежные вопросы