C ++ - основной вопрос темы - PullRequest
1 голос
/ 07 сентября 2010

У меня простой вопрос - как синхронизировать следующее?

У меня есть основной поток и дополнительный поток, который делает что-то только один раз и что-то - более одного раза.

В основном:

Вторичная резьба:

{
   Do_Something_Once();

   while (not_important_condition) {
      Do_Something_Inside_Loop();
   }
}

Я хочу приостановить свой основной поток, если не выполнено действие Do_Something_Once, и сейчас я использую обычное значение bool is_something_once_done = false;, чтобы указать, завершено ли действие.

Следовательно, код моего основного потока выглядит следующим образом:

{
   Launch_Secondary_Thread();

   while (!is_something_once_done) {
      boost::this_thread::sleep(milliseconds(25));
   }
}

, что, очевидно, не лучший способ выполнить такую ​​синхронизацию.

Любые альтернативы (лучше, если boost::thread - питание)?

Спасибо

Ответы [ 4 ]

4 голосов
/ 07 сентября 2010

Это задание для условных переменных.

Извлеките раздел Условные переменные в документах надбавки - пример - это почти то, что вы делаете.

Что бы вы ни делали, не делайте петлю занятого ожидания со сном

2 голосов
/ 07 сентября 2010

Вы могли бы рассмотреть возможность использования механизма переменных условия буста .Он предназначен для этого сценария.

1 голос
/ 07 сентября 2010

Введите код, подходящий для вашей платформы, где я добавил комментарии ниже:

{
   // Create event visible by second thread to be signalled on completion
   Launch_Secondary_Thread();

   // Wait for event to be signalled
}

{
   Do_Something_Once();
   // set the event state to signalled so that 1st thread knows to continue working

   while (not_important_condition) {
      Do_Something_Inside_Loop();
   }
}

Убедитесь, что событие ДЕЙСТВИТЕЛЬНО получает сигнал, даже если 2-й поток завершает работу ненормально после исключения или другой ошибки. Если нет, ваш 1-й поток никогда не проснется. Если вы не можете поставить тайм-аут на ожидание.

0 голосов
/ 07 сентября 2010

Вы можете использовать мьютексные блокировки!

Do_Something_Once()
{
   boost::mutex::scoped_lock(mutex);
   // ...
}

Обновление:

В вашем конкретном случае я бы использовал условную переменную, как предлагали другие.

...