2012-09-08 61 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