在Windows下同步C++代码的API失败

Failure in synchronization APIs for C++ code under Windows

本文关键字:API 失败 代码 C++ Windows 同步      更新时间:2023-10-16

如果我定义一个模板结构,如下所示:

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的讨论:

为什么WaitForSingleObject会返回WAIT_FAILED

这表明,即使有无限的超时,失败也是有可能的。