-2

如果我等待关闭的互斥锁会发生什么?

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);  
......
}
4

2 回答 2

2

CloseHandle(hMutex)在创建线程之前完成。因此,互斥锁的句柄无效,根据此处显示的代码,结果肯定如下:

  • WaitForSingleObject立即返回WAIT_FAILED (0xFFFFFFFF):函数失败。要获取扩展错误信息,请调用 GetLastError。

  • 调用GetLastError将显示ERROR_INVALID_HANDLE (0x6):句柄无效。

建议:始终正确评估 API 调用的返回值。MSDN 提供易于理解的文档。

于 2013-10-19T15:18:34.590 回答
1

在“CloseHandle”之后,“hMutex”的值不再有效,因此 WaitForSingleObject() 应返回 WAIT_FAILED 并且 GetLastError() 应返回指示句柄无效的错误代码。

但是与此同时,Windows 可能已将句柄分配给另一个对象。也许现在仍然存储在“hMutex”中的值标识了一些由 CreateThread() 在内部创建的对象。在这种情况下,WaitForSingleObject() 将等待该对象。

以可能等待“关闭的句柄”的方式编写代码并不是一个好主意,因为此时句柄可能已被重新分配给另一个对象。

于 2013-10-19T12:46:29.747 回答