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++ - 基本线程问题的主要内容,如果未能解决你的问题,请参考以下文章