多线程程序只执行最后创建的线程?
Multithreading program executing only last created thread?
我已经创建了 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
我有两个问题:
- 我只创建了 4 个线程,为什么显示线程 #: 5
- 所有创建的 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;
}
i
是一个静态变量——只有一个实例。您将其地址传递给线程并在每次调用 printf
时取消引用它。所以当主线程更改i
的值时,所有工作线程立即看到新值。正是出于这个原因,您会看到线程 #5 - 一旦 for()
循环结束,这就是 i
的值。
而不是 (LPVOID)&i
,传递 (LPVOID)i
,并在线程内使用 (int)param
而不是 *((int*)param)
。将指针转换为 int 并返回在 C 中是合法的(尽管如果使用不当会很危险)。
我已经创建了 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
我有两个问题:
- 我只创建了 4 个线程,为什么显示线程 #: 5
- 所有创建的 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;
}
i
是一个静态变量——只有一个实例。您将其地址传递给线程并在每次调用 printf
时取消引用它。所以当主线程更改i
的值时,所有工作线程立即看到新值。正是出于这个原因,您会看到线程 #5 - 一旦 for()
循环结束,这就是 i
的值。
而不是 (LPVOID)&i
,传递 (LPVOID)i
,并在线程内使用 (int)param
而不是 *((int*)param)
。将指针转换为 int 并返回在 C 中是合法的(尽管如果使用不当会很危险)。