2012-10-20 42 views
-2

我有一個核心2雙核處理器。以特定的順序運行八個線程,直到終止

我想要創建並運行八個線程(在它們之間沒有共享數據),以便在任何給定時間內,所有八個線程都將在同一時間運行線程1和線程2,並且線程1和線程2線程2不能由我想優先級的處理器同時運行給予線程1,使得線程1將線程之前運行2.

同樣線程3和4可以同時運行,但如果線3和線4不能同時運行我希望線程3在線程4之前執行,而不是在線程1和2之前執行,而不是在線程5和6以及線程7和線程8之後執行。

線程5和線程6相同,線程7和線程8.

所有8個線程後有完成其任務的8個線程會在上面給定的順序一次又一次地運行,直到終止。

使用C++和Visual Studio 2008在Windows 7如何才能做到這一點?

是否可以用C++實現這個?

+2

確定要以這種方式使用線程嗎?這幾乎完全是他們**而不是**。 – leftaroundabout

+0

它是功課嗎? –

+3

「1和2可以同時運行」,但「線程2必須在線程1之後運行」?這有什麼意義? – jalf

回答

1

好,很多扯皮真正得到這個問題了,你以後,這裏就是我要去嘗試回答的版本:

創建後線程並不能保證任何兩個線程將在雙核處理器上同時運行。因此,如果兩個線程不會同時運行我要優先考慮,使得線程1(創建第一)將首先運行和線程2(創建的第二)總是線程運行後1

,幸運的是,答案到是相當簡單的。您的程序不知道在什麼時候運行哪些線程。操作系統不會告訴你什麼時候啓動和停止線程,所以你不能編寫任何類型的「線程1正在運行?如果沒有,我會暫停並讓它運行」檢查。

但是,您可以將線程設置爲具有不同的優先級。這向操作系統表明它應該計劃執行哪些操作。給你的線程一個逐漸減少的優先級(所以線程1具有高優先級,線程2低一級等等),並且你會做出一些類似於你想要的東西。在Windows上,這可能實際上運行得很好,因爲Windows總是試圖選擇可用的最高優先級的線程/進程。 Linux將盡力確保所有線程都一些執行時間,但只會給更高優先級的。

和當然,像這樣的優先搞亂也會影響你的程序是如何安排有關一切的PC上運行。你真的試圖以錯誤的方式去解決這個問題,而更爲理想的解決方案就是簡單地找到另一種並行化方案。

+0

'找到另一個並行化的方案' - 是的,一個可行的方案。 –

0

我不認爲你可以控制執行線程的順序。線程創建完成後,由操作系統爲您進行安排。你所能做的就是等待線程在父線程中完成。

+0

感謝您的回答。是否有任何機制可以用來強制線程等待所有8個線程完成並重新啓動? – mvr950

+0

是的。每個C++編譯器都爲我們提供了一個機制來實現這一點例如,在Posix線程中,我們有一個函數pthread_join(...),它等待您在函數參數中傳遞的線程完成。由於您有8個線程,您可以在for循環中調用該函數。 – rahul

+0

不是這樣,你可以肯定地阻塞線程,直到另一個線程中的某些條件得到滿足爲止 – jalf

0

什麼?你想用運行的線程1,那麼線程2個...

不要使用線程。使用while循環,並呼籲:

While(1) 
{ 
    foo1(); 
    foo2(); 
    foo3(); 
    . 
    . 
    . 
} 
+0

是的,我可以那樣做。但我希望任何2個線程同時運行。 – mvr950

+0

@ mvr950然後告訴我們*哪兩個線程可以同時運行 – jalf

+0

@jalf我的意思是線程1,線程2 ....線程8是線程1是從攝像頭1捕獲圖像的線程,來自攝像機2的線程2,來自攝像機3的線程3 ...來自攝像機8的線程8.我希望線程1和線程2同時運行,線程3和4同時運行...並且線程7和線程8同時運行時間。 – mvr950