2013-10-19 33 views
-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); 
...... 
} 
+2

更好的问题:当你运行这段代码时**发生了什么**? – WhozCraig

+0

如果您评估了WaitForSingleObject的返回值,您可能会知道答案。 – cdoubleplusgood

+0

会发生什么?那么严格来说,任何“可能”都会发生,因为你调用了未定义的行为。 Windows会立即杀死你的程序,或让蚂蚁吃你的主窗口或任何东西。 (实际上,它可能要么产生错误,要么无限期地等待,但它仍然是一个糟糕的主意。) –

回答

1

“CloseHandle的”的“hMutex”值后不再有效更使WaitForSingleObject的()应该返回WAIT_FAILED,并且GetLastError()应该返回表明该句柄无效的错误代码。

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

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

2

CloseHandle(hMutex)完成之前线程被创建。因此,该句柄互斥是无效的,并根据这里显示的代码,其结果肯定是以下几点:

  • WaitForSingleObject立即返回WAIT_FAILED(0xFFFFFFFF的):该功能已失败。要获得扩展的错误信息,请调用GetLastError。

  • 和呼叫GetLastError将显示ERROR_INVALID_HANDLE(0x6):句柄无效。

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

+0

但WaitForSingleObject不返回WAIT_FAILED,而是等待... –

+0

...什么是问题?在调用'CloseHandle(hMutex)'后检查'ReleaseMutex(hMutex)'的返回值。我希望返回值为零。 GetLastError将显示ERROR_INVALID_HANDLE。 – Arno

相关问题