多线程行为?

时间:2015-08-12 19:22:03

标签: c multithreading mfc

我有以下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

所以我想了解这里发生了什么。为什么线程的打印件彼此不同(一个线程打印应该由其他线程打印的数字)?为什么一个线程只在要创建的下一个线程之后打印(一次全部!)?

1 个答案:

答案 0 :(得分:2)

每个帖子都在打印分配给它的号码。只是所有线程都在同一时间运行,因此它们的输出重叠。如果您在printf的开头和结尾添加ThreadFunc,您可能会看到更好的情况。

Windows不保证线程将运行的顺序或线程运行的确切时间,这就是您看到变量的原因。每次运行程序时,您很可能会得到不同的结果。