【发布时间】:2017-12-17 14:53:13
【问题描述】:
我在创建数千个线程并关闭它时遇到问题。 看这段代码:
HANDLE threadHandles[i];
for(int i = 0; i < 1000; i++)
{
CreateThread(0, 0, &func, 0, CREATE_SUSPENDED, threadHandles[i]);
printf("%i - %i\n", i, threadHandles[i]);
CloseHandle(threadHandles[i])
}
printf("Last Error is %i", GetLastError());
它应该继续这个输出:
0 - 236423
1 - 23456236
2 - 2373547
3 - 73521346
4 - 23456775
5 - 78543683465
...
2998 - 754752
2999 - 23462346
Last Error is 0
像这样。
但实际上它不会打印任何内容。为什么?因为其中一个创建的线程与标准输出句柄发生冲突。 我是用这段代码实现的:
HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE threadHandles[i];
for(int i = 0; i < 1000; i++)
{
CreateThread(0, 0, &func, 0, CREATE_SUSPENDED, threadHandles[i]);
printf("%i - %i\n", i, threadHandles[i]);
if(threadHandles[i] != stdout) // I have stdout == 12 on my machine
CloseHandle(threadHandles[i])
}
它是这样工作的:
0 - 236423
1 - 23456236
2 - 2373547
3 - 0
4 - 23456775
5 - 78543683465
...
2998 - 0
2999 - 23462346
Last Error is 6
问题出在哪里?为什么创建的句柄和现有的标准句柄有冲突?
【问题讨论】:
-
在问题标题和提供的输出中,您建议循环计数应为 3,000 - 但在代码中,它只有 1,000。这是您使用的确切代码吗?
-
这只是一个例子
-
你打印 threadId 而不是线程句柄。但即使你的 printf 不正确 -
0 - 236423?236423不能是始终具有4*n形式的线程 ID