2015-01-12 34 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的指针是合法的(尽管如果使用不当,也是危险的)。