2010-09-07 120 views
1

我有一个简单的线程问题 - 以下应如何同步?C++ - 基本线程问题

我有一个主线程和一个辅助线程,它只能做一次某事 - 更多一次。

基本上是:

二级螺纹:

{ 
    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 - 供电)?

谢谢

+1

注意:没有基本的线程问题。有11种类型的人:1)认为他们可以使用线程编程的人10)知道它的人很难但认为他们理解线程11)知道它的人很难并理解线程之间的相互作用超出了他们(这些是唯一的人是正确的) – 2010-09-07 17:16:29

+0

@Martin:是的,嗨! – 2010-09-07 22:22:30

回答

4

这是条件变量的工作。

查看助推文档中的Condition Variables部分 - 示例几乎与您正在做的一样。

不管你做什么,不要做一个忙等待循环睡眠

+0

根据要求提供针对升压特定解决方案的+1 – 2010-09-07 16:23:50

+0

“不管你做什么,都不要在睡梦中忙碌等待” - 谨慎地阐述为什么这是件坏事? – StackedCrooked 2010-09-07 16:33:27

+0

@Stacked这是浪费。一方面,它增加了一些不必要的延迟(本例中平均为12.5毫秒),另一方面,它使系统做了不必要的工作(将定时器触发N次)。选择睡眠间隔意味着对任务完成的预期时间和延迟与CPU消耗之间可接受的折衷做出假设。如果事情发生变化(例如,现在代码被循环调用1000次,所以12.5ms延迟变为12.5秒),这些假设可能不再有效。此外,这是一种“代码味道”,表明对可用线程原语缺乏了解。 – 2010-09-07 16:58:37

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

确保事件不会得到暗示,即使第二个线程之后不能正常退出一个例外或其他错误。如果没有,你的第一个线程将永远不会醒来。除非你能等待等待。

0

你可以随意使用互斥锁!

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

更新:

您的特定情况下,我会去与条件变量,正如其他建议。

+0

你能解释一下这将如何工作吗? – 2010-09-07 16:17:41

+0

以升压特定示例更新。 – 2010-09-07 16:20:27

+0

-1对于不完整或不正确的答案 – 2010-09-07 16:24:42