1

MFC の CSingleLock 実装を独自のものに置き換えてみましたが、Windows 7 にはなく、MFC の CSingleLock を使用する OS にもなかった Windows XP でデッドロックが発生し、すべての Lock & Unlock を調べました。私のアプリでは、実装に欠けているもの:

class CCriticalSection
{
    CRITICAL_SECTION m_cs; 
public:
    CCriticalSection()
    {
        InitializeCriticalSection(&m_cs);
    }
    ~CCriticalSection()
    {
        DeleteCriticalSection(&m_cs);
    }
    void Lock()
    {   
        EnterCriticalSection(&m_cs);
    }
    BOOL TryLock()
    {
        return TryEnterCriticalSection(&m_cs);
    }
    void Unlock()
    {
         if(m_cs.LockCount > -1)
              LeaveCriticalSection(&m_cs);
    }
};

#include "CCriticalSection.h"
class CSingleLock {
    CCriticalSection *m_cs;
public:
    CSingleLock(CCriticalSection* cs = NULL, bool bLock = false)
    {
        m_cs = cs;
        if(m_cs != NULL)
        {
            if(bLock)
                m_cs->Lock();
        }
    }
    void Unlock()
    {
        if(m_cs != NULL)
            m_cs->Unlock();
    }
    void Lock()
    {
        if(m_cs != NULL)
            m_cs->Lock();
    }
    ~CSingleLock()
    {
        if(m_cs != NULL)
            m_cs->Unlock();
    }

};
4

2 に答える 2

2

ロック クラスを本当に役立つものにするには、次のように改善する必要があります。

class CSingleLock 
{
    CCriticalSection *m_cs;
    bool m_bLock;

public:
    CSingleLock(CCriticalSection* cs = NULL, bool bLock = false)
    {
        m_cs = cs;
        if(m_cs != NULL)
        {
            if(bLock)
                m_cs->Lock();
            m_bLock = bLock;
        }
    }
    void Unlock()
    {
        if(!m_cs || !m_bLock)
            return;
        m_cs->Unlock();
        m_bLock = false;
    }
    void Lock()
    {
        if(!m_cs || m_bLock)
            return;
        m_cs->Lock();
        m_bLock = true;
    }
    ~CSingleLock()
    {
        Unlock();
    }
};

間違った CS の使用によるトラブルを回避するのに十分なほどインテリジェントである必要があります。

于 2013-10-16T18:04:08.297 に答える