2012-09-08 88 views
1

下的C++代碼同步的API。如果我定義模板結構,像這樣:失敗的Windows

template <typename T> 
struct SYNCHED_DATA 
{ 
    SYNCHED_DATA() 
    { 
     hMutex = ::CreateMutex(NULL, FALSE, NULL); 
    } 
    ~SYNCHED_DATA() 
    { 
     if(hMutex) 
      CloseHandle(hMutex); 
     hMutex = NULL; 
    } 

    void set(T* pV) 
    { 
     if(pV) 
     { 
      ::WaitForSingleObject(hMutex, INFINITE); 
      var = *pV; 
      ::ReleaseMutex(hMutex); 
     } 
    } 
    void get(T* pV) 
    { 
     if(pV) 
     { 
      ::WaitForSingleObject(hMutex, INFINITE); 
      *pV = var; 
      ::ReleaseMutex(hMutex); 
     } 
    } 

private: 
    HANDLE hMutex; 
    T var; 

    SYNCHED_DATA(const SYNCHED_DATA& s) 
    { 
    } 
    SYNCHED_DATA& operator = (const SYNCHED_DATA& s) 
    { 
    } 
}; 

我可以放心,這些WaitForSingleObject的()的API將始終返回WAIT_OBJECT_0?如果不是,那麼他們在什麼情況下可能會失敗,我該如何處理呢?

+0

[文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v = vs.85).aspx)詳細介紹了返回代碼。 – chris

+0

「WAIT_FAILED =函數失敗,要獲得擴展錯誤信息,請調用GetLastError。」 - 你可以「細節」? – c00000fd

+0

我的意思是它具有所有可能的返回值及其含義。如果你沒有注意到,'GetLastError()'使用的錯誤列表也是巨大的。 – chris

回答

0

舊事新對如何關閉手柄之前的等待成功將導致WAIT_ABANDONED任何人等待的文章:

http://blogs.msdn.com/b/oldnewthing/archive/2005/09/12/463977.aspx

有在這個非常站點WAIT_FAILED一些討論:

Why would WaitForSingleObject return WAIT_FAILED

這些表明即使在無限超時的情況下失敗也是可能的。

+0

我很抱歉,但是在我上面發佈的代碼等待成功之前,如何關閉句柄?也許我只是沒有看到什麼...... – c00000fd

+0

一個線程運行'get',例如獲取互斥鎖,並開始複製。 (比方說,你有'SYNCHED_DATA >',或者其他東西,裏面有很多字符串。)其他線程同時嘗試獲取互斥鎖,並最終等待。然後,另一個線程在此過程中銷燬SYNCHED_DATA對象。這有點做作,但我認爲沒有足夠的信息來證明這不會發生。 –

+0

好的,一種可能性是如果線程在它擁有互斥鎖時被終止。但我甚至不在我的代碼中使用TerminateThread API。 – c00000fd