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

Shi*_*nha 0 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 
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  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;
}
Run Code Online (Sandbox Code Playgroud)

Sev*_*yev 7

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

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