2013-05-03 94 views
1

我有一個函數,我想在不同的線程中運行。該函數填充的數據結構,例如:在C++中發信號父線程11

per_thread(int start_value, std::vector<SomeStruct>& reference) 
{ 
    for (size_t i = 0; i < 500; i++) 
    { 
     reference.push_back(func(i)); 
     if (i == 2) 
      send_signal_back(); 
    } 
} 

然而,這樣做是通過循環去若干次後,我要開始另一個線程,以此作爲起始值。不幸的是,我不明白如何發送信號回到父線程。

所以我想是這樣的:

for(size_t j = 0; j < 5000; j += num_threads) 
{ 
    for (size_t i = 0; i < num_threads; i++) 
    { 
     std::async(per_thread(foo(j+i), std::ref(vec)); 
     //wait for signal 
    } 
} 

如何發送這樣的信號?

+0

線程之間沒有「父子」關係。線程只是線程。也許你正在考慮流程? – 2013-05-03 21:29:08

+1

@KerrekSB:沒有強制執行的父子關係,但有些線程創建了一些其他線程(除了主線程),所以從這個意義上說,有一個父子關係。我沒有考慮流程,至少沒有我理解的程度。一般而言,我仍然對新併發性感到陌生。 – 2013-05-03 21:31:17

+0

如何處理[條件變量](http://en.cppreference.com/w/cpp/thread/condition_variable)? – 2013-05-03 21:32:53

回答

4

我不會使用async,因爲這太高級了,還有別的事情。 (這是little rant of mine,涉及async。)

它看起來像你真的只想要線程和手動控制它們。

試試這個:

#include <vector> 
#include <thread> 

std::vector<std::thread> threads; 

for (std::size_t j = 0; j < 5000; j += num_threads) 
{ 
    for (std::size_t i = 0; i != num_threads; ++i) 
    { 
     threads.emplace_back(per_thread, foo(i + j), std::ref(vec)); 
    } 
} 

for (auto & t: threads) 
{ 
    t.join(); 
} 

一旦運行時間最長的線程完成這將結束。 (「長尾」效應)

+0

所以,當這樣做時,線程是相當獨立的:第二個線程不依賴於第一個線程的中間結果。我想我的問題可能不是很清楚,我會試圖解決它。 – 2013-05-03 21:37:45

+3

@AndrewSpott:好的,但讓我警告你,如果你的個人遊戲取決於彼此,那麼在開始編碼之前,你應該真的認真考慮並行化設計。很難共享並行代碼可能會比單線程代碼慢得多。您想盡可能避免*任何*種分享。 – 2013-05-03 21:38:59

+0

我覺得現在有點更清楚了。 'func'代表一些只依賴於它的輸入的計算上昂貴的函數,這就是爲什麼我肯定這會加速我的代碼 – 2013-05-03 21:41:06