【问题标题】:C++ - basic thread questionC++ - 基本线程问题
【发布时间】:2010-09-07 16:01:41
【问题描述】:

我有一个简单的线程问题 - 下面应该如何同步?

我有一个主线程和一个辅助线程,它们只做一次和某事 - 不止一次。

基本上:

次要线程:

{
   Do_Something_Once();

   while (not_important_condition) {
      Do_Something_Inside_Loop();
   }
}

我想暂停我的主线程,除非Do_Something_Once 操作完成,现在我使用纯布尔值is_something_once_done = false; 来指示操作是否完成。

因此,我的主线程的代码如下所示:

{
   Launch_Secondary_Thread();

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

这显然不是执行此类同步的最佳方式。

任何替代方案(如果boost::thread - 供电更好)?

谢谢

【问题讨论】:

  • 注意:没有基本的线程问题。有 11 种人: 1) 认为他们可以使用线程进行编程的人 10) 知道这很难但认为他们了解线程的人 11) 知道这很难并且理解线程之间的相互作用的人超出了他们(这些是唯一正确的人)

标签: c++ multithreading synchronization


【解决方案1】:

这是条件变量的工作。

查看 boost 文档的 Condition Variables 部分 - 那里的示例几乎与您正在做的完全一样。

无论你做什么,都不要在睡眠中进行忙等待循环

【讨论】:

  • “无论你做什么,都不要在睡眠中进行忙等待循环” - 请详细说明为什么这是一件坏事?
  • @Stacked 太浪费了。一方面,它增加了一些不必要的延迟(在本例中平均为 12.5 ms),另一方面,它使系统做不必要的工作(触发计时器 N 次)。选择睡眠间隔意味着对任务完成的预期时间以及延迟与 CPU 消耗之间可接受的权衡做出假设。如果事情发生变化(例如,代码现在在循环中被调用 1000 次,因此 12.5 毫秒的延迟变为 12.5 秒)这些假设可能不再有效。此外,这是一种“代码异味”,表明缺乏对可用线程原语的认识。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    确保事件确实收到信号,即使第二个线程在异常或其他错误后异常退出。如果没有,您的第一个线程将永远不会醒来。除非您可以设置超时等待。

    【讨论】:

      【解决方案4】:

      您可以随意使用互斥锁!

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

      更新:

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

      【讨论】:

      • 更新了 boost 的具体例子。
      • 在编辑后尝试撤消投票无效 - 在您的历史记录中的其他位置添加 +1
      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多