首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

多线程程序中,WaitSingleObject 操作的有关问题

2014-05-24 
多线程程序中,WaitSingleObject 操作的问题我印象中 在看 侯捷 翻译的《Win32多线程程序设计》中,谈到过 用W

多线程程序中,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会销毁句柄,造成等待出错退出。

热点排行