如果我像这样定义模板结构:

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吗?如果不是,那么在什么情况下它们会失败,那么我应该如何处理呢?

最佳答案

The Old New Thing上有一篇文章,介绍了在等待成功之前关闭句柄将如何导致等待的任何人使用WAIT_ABANDONED

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

这个站点上有关于WAIT_FAILED的一些讨论:

Why would WaitForSingleObject return WAIT_FAILED

这些表明即使无限超时也可能导致故障。

09-25 22:04