2008-10-17 125 views
4

MSDN說爲什麼WaitForSingleObject的返回WAIT_FAILED

如果函數調用失敗,返回值爲WAIT_FAILED。要獲得擴展的錯誤信息,請調用GetLastError。

的代碼是:

HANDLE  m_mutex_handle; /**< m_mutex_handle. The handle to the created mutex. */ 
m_mutex_handle = ::CreateMutex(0, false, NULL); 
::WaitForSingleObject(m_mutex_handle, INFINITE); 

但什麼是可能發生的原因是什麼?

+2

那麼,GetLastError()返回什麼?這通常會給你一個很好的線索。 – Ferruccio 2008-10-17 01:22:35

回答

4

傳入一個假對象可能會導致這種情況。

+0

傳入一個_seriously_僞造對象甚至可能導致未定義的行爲,但也許函數檢查這些情況。 :-P – 2008-10-17 00:43:17

1

正在等待句柄時關閉句柄也會導致未定義的行爲。

7

如果您在對象上缺少SYNCHRONIZE權限,則無法等待。 WAIT_FAILED將被退回。

1

當傳遞一個線程句柄數組時,我從WaitForMultipleObjects中獲得了WAIT_FAILED,因爲它們中的一個是僞句柄。不朽的雷蒙德陳解釋,並提供修復:https://blogs.msdn.microsoft.com/oldnewthing/20141015-00/?p=43843

+0

如果你正在看這個問題,你應該閱讀上面鏈接的Raymond Chen的博客文章。基本上不是所有的手柄都是手柄,有些是特殊的佔位符「假手柄」,並不是絕對值。 – 2017-03-12 02:16:01