多线程程序只执行最后创建的线程?

时间:2015-01-12 15:03:51

标签: c++ c multithreading createthread

我创建了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 

我有两个问题:

  1. 我只创建了4个线程,为什么它显示线程#:5
  2. 创建的所有4个线程应该按顺序运行,但为什么它只运行最后创建的线程?
  3. 源代码:

    #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;
    }
    

1 个答案:

答案 0 :(得分:7)

i是一个静态变量 - 只有一个实例。每次调用printf时,您都会将其地址传递给线程并取消引用它。因此,当主线程更改i的值时,所有工作线程立即看到新值。由于这个原因,你会看到第5个主题 - 一旦i循环结束,这就是for()的值。

而不是(LPVOID)&i,传递(LPVOID)i,而在线程中,使用(int)param代替*((int*)param)。将指针转换为int和back在C中是合法的(尽管如果误用则会很危险)。