多线程行为?
Multithread behavior?
我有以下 MFC 控制台程序:
UINT ThreadFunc(LPVOID);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
for (int i = 0; i < 5; i++)
{
if (AfxBeginThread(ThreadFunc, (LPVOID)i))
{
printf("Thread launched: %d\n", i);
}
}
Sleep(2000);
system("pause");
return 0;
}
UINT ThreadFunc(LPVOID n)
{
for (int i = 0; i < 10; i++)
{
printf("%d%d%d%d%d%d%d%d\n", (int)n, (int)n, (int)n, (int)n, (int)n, (int)n, (int)n, (int)n);
}
return 0;
}
在某些执行中,其输出是:
Thread launched: 0
00000000
00000000
00000000
00000000
00000000
00000000
Thread launched: 1
11111111
11111111
11111111
Thread launched: 2
00000000
00000000
00000000
00000000
33333333
33333333
33333333
Thread launched: 3
11111111
11111111
11111111
11111111
44444444
44444444
44444444
Thread launched: 4
22222222
22222222
22222222
22222222
22222222
22222222
22222222
22222222
22222222
22222222
11111111
11111111
11111111
44444444
44444444
44444444
44444444
44444444
44444444
44444444
33333333
33333333
33333333
33333333
33333333
33333333
33333333
所以我想了解这里发生了什么。为什么线程的打印彼此不同(一个线程打印应该由另一个线程打印的数字)?为什么一个线程仅在要创建的下一个线程之后打印(一次全部!)?
每个线程都在打印分配给它的数字。只是您的所有线程都同时处于 运行ning 状态,所以它们的输出是重叠的。如果在 ThreadFunc
.
的开头和结尾添加 printf
,您可能会看到更好的情况
Windows 不保证线程将 运行 的顺序或线程将 运行 的确切时间,这就是您看到变量的原因。每次 运行 您的程序很可能会得到不同的结果。
我有以下 MFC 控制台程序:
UINT ThreadFunc(LPVOID);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
for (int i = 0; i < 5; i++)
{
if (AfxBeginThread(ThreadFunc, (LPVOID)i))
{
printf("Thread launched: %d\n", i);
}
}
Sleep(2000);
system("pause");
return 0;
}
UINT ThreadFunc(LPVOID n)
{
for (int i = 0; i < 10; i++)
{
printf("%d%d%d%d%d%d%d%d\n", (int)n, (int)n, (int)n, (int)n, (int)n, (int)n, (int)n, (int)n);
}
return 0;
}
在某些执行中,其输出是:
Thread launched: 0
00000000
00000000
00000000
00000000
00000000
00000000
Thread launched: 1
11111111
11111111
11111111
Thread launched: 2
00000000
00000000
00000000
00000000
33333333
33333333
33333333
Thread launched: 3
11111111
11111111
11111111
11111111
44444444
44444444
44444444
Thread launched: 4
22222222
22222222
22222222
22222222
22222222
22222222
22222222
22222222
22222222
22222222
11111111
11111111
11111111
44444444
44444444
44444444
44444444
44444444
44444444
44444444
33333333
33333333
33333333
33333333
33333333
33333333
33333333
所以我想了解这里发生了什么。为什么线程的打印彼此不同(一个线程打印应该由另一个线程打印的数字)?为什么一个线程仅在要创建的下一个线程之后打印(一次全部!)?
每个线程都在打印分配给它的数字。只是您的所有线程都同时处于 运行ning 状态,所以它们的输出是重叠的。如果在 ThreadFunc
.
printf
,您可能会看到更好的情况
Windows 不保证线程将 运行 的顺序或线程将 运行 的确切时间,这就是您看到变量的原因。每次 运行 您的程序很可能会得到不同的结果。