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

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 に答える