C ++ - 基本的线程问题

时间:2010-09-07 16:01:41

标签: c++ multithreading synchronization

我有一个简单的线程问题 - 如何同步以下内容?

我有主线程和辅助线程,它只执行一次某事 - 更多一次。

基本上:

辅助主题:

{
   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 个答案:

答案 0 :(得分:4)

这是条件变量的工作。

查看提升文档的Condition Variables部分 - 这个例子几乎就是你正在做的事情。

无论你做什么,都不要做一个带睡眠的忙等待循环

答案 1 :(得分:2)

您可以考虑使用boost's condition variable mechanism。它专为这种情况而设计。

答案 2 :(得分:1)

插入适合您平台的代码,我在下面添加了评论:

{
   // 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();
   }
}

确保事件已发出信号,即使第二个线程在异常或其他错误后异常退出也是如此。如果没有,你的第一个线程永远不会醒来。除非你可以暂停等待。

答案 3 :(得分:0)

您可以自由使用互斥锁!

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

更新

对于你的特定情况,我会使用条件变量,正如其他人建议的那样。