2010-09-07 77 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