怎么会发生,如果我等待一个封闭的互斥锁?

时间:2013-10-19 10:14:04

标签: windows multithreading winapi

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

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

2 个答案:

答案 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()将等待该对象。

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