C++ - 基本线程问题

Posted

技术标签:

【中文标题】C++ - 基本线程问题【英文标题】:C++ - basic thread question 【发布时间】: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) 知道这很难并且理解线程之间的相互作用的人超出了他们(这些是唯一正确的人) 【参考方案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

以上是关于C++ - 基本线程问题的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS:具有多线程的本机 C++ 模块(openmp)

混合 C 和 C++ 的线程同步

C++多线程编程

一组线程的 C++ 互斥锁

Python 多线程性能 - 改用 C++?

没有多线程的 C++ 套接字非同步/并行代码