2011-07-13 104 views
2

在for循環中有一個CreateThread()調用,並且我希望所有線程一個接一個地啓動,並且每個線程都將數據寫入一個對象。如何在不等待C++響應的情況下啓動線程?

 `$while (ii != mapOServs.end()) 
{ 
     Array_of_Thread_Handles[i] = CreateThread(NULL,0,MyThread, &args[i] , 0 , NULL); 
    } 

但是,線程只有等到WaitForMultipleObjects或WaitForSingleObject時纔會啓動。

如何使所有線程一個接一個地運行而不等待響應?

此外,什麼是最好的對象使用,以便它可以在不同的線程同時修改。

回答

7

線程確實立即「啓動」--- Windows將創建必要的內部結構,分配堆棧等,並將它們添加到調度程序的運行列表中。但是,他們不一定是立即預定

特別是,執行啓動的線程可能會繼續運行,直到其用完時間片爲止。如果你有比處理器內核(包括其他進程中的線程)更多的線程運行,那麼你的新線程很可能不會在處理器上安排一段時間,並且執行啓動的線程可能會執行最多同步調用,例如WaitForSingleObject他們中的任何一個都有機會做任何工作。

4

線程實際上都立即開始。只要您正確地同步訪問該結構,就可以從線程寫入任何數據結構。

+1

它們開始,但實際上可能不會在CreateThread函數之後開始直接運行,因爲任務調度程序可以讓主線程保持運行並且只在一段時間後運行線程。 – Vitor

2

似乎在調試時卡住了。當您逐步執行CreateThread時,它可能不會立即創建並運行線程,因爲您在處調試。請記住,在積極調試代碼的同時,只允許一個線程運行,其他所有線程保持暫停狀態。當你點擊F10或F11時,調試器會給出調試對象來運行,這最終會要求OS運行進程/線程來執行。我可以補充更多,但你的問題需要更多的澄清。

+0

你說得對,我被困在調試中。我想知道爲什麼其他線程在我調試一個線程時沒有運行並顯示它們的消息。 – roymustang86

相關問題