多线程程序中,WaitSingleObject 操作的问题
我印象中 在看 侯捷 翻译的《Win32多线程程序设计》中,谈到过 用WaitSingleObject (xxhandle,INFINIT) 去等待 xx的句柄时,
如果此时用CloseHandle关闭 xx 的句柄, 就可能导致 WaitSingleObject 的行为是未知的? 例如一直等待下去
是不是有这一说? 请读过此书 或 了解线程知识的同学们指点下。 如果是看过此书,帮我确认下,书上是不是这么说过,我记
不清了,刚才翻了下,似乎又没找到哪里有这句
[解决办法]
试一下就知道了,我试的结果是可知的,我只试了线程,一旦CloseHandle,WaitSingleObject会立即返回
不过用WaitSingleObject,CloseHandle通常是放在后机,不然没意义了
- C/C++ code
#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <conio.h>DWORD WINAPI ThreadProc(LPVOID);int main(){ HANDLE hThread1; HANDLE hThread2; DWORD dwExitCode1 = 0; DWORD dwExitCode2 = 0; DWORD dwThreadID = 0; hThread1 = CreateThread(NULL, 0, ThreadProc, (LPVOID)1, 0, &dwThreadID); printf("线程1启动了\n"); hThread2 = CreateThread(NULL, 0, ThreadProc, (LPVOID)2, 0, &dwThreadID); printf("线程2启动了\n"); CloseHandle(hThread1);//这里提前一个,做试验 WaitForSingleObject(hThread1, INFINITE);//目标线程退出此函数会返回,否则处于等待信号状态 printf("线程1退出了 %d \n", dwExitCode1); WaitForSingleObject(hThread2, INFINITE); printf("线程2退出了 %d \n", dwExitCode2); //CloseHandle(hThread1);//通常放在后面 //CloseHandle(hThread2);//通常放在后面 return EXIT_SUCCESS;}DWORD WINAPI ThreadProc(LPVOID lpParame){ DWORD dwParm = (DWORD)lpParame; printf("%d正在运行============= \n", lpParame); Sleep(dwParm * 1000 * 2); return dwParm * 10; }
[解决办法]
在WaitForSingleObject返回前CloseHandle
WaitForSingleObject将直接返回WAIT_FAILED
GetLastError为ERROR_INVALID_HANDLE(无效句柄)
[解决办法]
我也试了,返回WAIT_FAILED
[解决办法]
要看此句柄是什么类型的,如果是线程句柄,closeHandle并无任何影响(其只对使用计数减一,并不销毁句柄)。依然要等到线程结束才返回。
如果句柄是时间内核对象,则closeHandle会销毁句柄,造成等待出错退出。