DWORD WINAPI Fun2Proc(LPVOID lpParameter // thread data)
{
while(TRUE)
{
WaitForSingleObject(hMutex,INFINITE); //what would happen here?
Sleep(1000);
ReleaseMutex(hMutex);
}
return 0;
}
HANDLE hMutex;
int main(){
HANDLE hThread2;
hMutex=CreateMutex(NULL, FALSE,"tickets");
CloseHandle(hMutex); // and closed here
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread2);
......
}
答案 0 :(得分:2)
CloseHandle(hMutex)
在创建线程之前完成。因此,互斥锁的句柄无效,根据此处显示的代码,结果肯定如下:
WaitForSingleObject
立即返回 WAIT_FAILED (0xFFFFFFFF):该功能失败。要获取扩展错误信息,请调用GetLastError。
并且对GetLastError
的调用将显示 ERROR_INVALID_HANDLE (0x6):句柄无效。
建议:始终正确评估API调用的返回值。 MSDN提供易于理解的文档。
答案 1 :(得分:1)
在“CloseHandle”之后,“hMutex”的值不再有效,所以WaitForSingleObject()应该返回WAIT_FAILED,而GetLastError()应该返回一个错误代码,表明句柄无效。
但与此同时,Windows可能已将句柄分配给另一个对象。也许现在仍然存储在“hMutex”中的值标识了一些由CreateThread()内部创建的对象。在这种情况下,WaitForSingleObject()将等待该对象。
以可能等待“关闭句柄”的方式编写代码并不是一个好主意,因为在此期间可能会将句柄重新分配给另一个对象。