1

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

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

4

1 回答 1

0

The Old New Thing 有一篇关于如何在等待成功之前关闭句柄将导致WAIT_ABANDONED任何人等待的文章:

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

WAIT_FAILED在这个网站上有一些讨论:

为什么 WaitForSingleObject 会返回 WAIT_FAILED

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

于 2012-09-08T23:29:29.250 回答