2015-01-12 90 views
0

我已創建4個線程,但是當我執行這個程序我得到這個作爲輸出:多線程程序只執行最後創建的線程?

Thread #: 1 
Thread #: 2 
Thread #: 3 
Thread #: 3 
Thread #: 4 
Thread #: 4 
Thread #: 4 
Thread #: 5 
Thread #: 5 
Thread #: 5 
. 
. 
. 
Thread #: 5 
Thread #: 5 

我有2個問題:

  1. 我只創建了4線程,爲什麼是它顯示線程#:5
  2. 創建的所有4個線程應該按順序運行,但它爲什麼只運行最後創建的線程?

的源代碼:

#include<windows.h> 


HANDLE ThreadHandle[4]; 
DWORD dwThreadId[4]; 

DWORD WINAPI ThreadFunction(LPVOID param) 
{ 

    while (1) 
    { 

     printf("Thread #: %d\n", *((int*)param)); 
    } 

    Sleep(10); 

    return 0; 
} 

int main() 
{ 
    static int i = 0; 
    for (i = 1; i <= 4; i++) 
    { 
     ThreadHandle[i] = CreateThread(NULL, 0, ThreadFunction, (LPVOID)&i, 0, &dwThreadId[i]); 
     Sleep(10); 

    }  
    while (1) 
    { 
     Sleep(100); 
    } 
    return 0; 
} 
+2

數組在C中爲零索引。寫入'ThreadHandle [4]'是未定義的行爲。 – EOF

+0

而且代碼不能用當前的{}用法進行編譯。併發控制檯輸出是... – deviantfan

回答

7

i是一個靜態變量 - 只有一個實例。您將自己的地址傳遞給線程,並在每次撥打printf時將其解除引用。所以當主線程更改值i,時,所有工作線程立即看到新值。因爲這個原因,你會看到線程#5 - 這是i的值,一旦for()循環結束。

而不是(LPVOID)&i,通過(LPVOID)i,並在線程內使用(int)param而不是*((int*)param)。在C中鑄造指向int和back的指針是合法的(儘管如果使用不當,也是危險的)。