1

我已经尝试用我自己的替换 MFC 的 CSingleLock 实现,但是我现在在 Windows XP 上遇到了死锁,而我在 Windows 7 上没有这种死锁,而且我在使用 MFC 的 CSingleLock 的任何一个操作系统上都没有死锁,除了查看每个 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 回答
1

MSDN 说“如果一个线程LeaveCriticalSection在没有指定临界区对象的所有权时调用,则会发生错误,可能导致另一个线程使用EnterCriticalSection无限期等待。”。

CSingleLock调用的析构函数,CriticalSection::UnlockLeaveCriticalSection没有检查关键部分是否由当前线程持有。

您需要跟踪关键部分的所有权。

于 2013-10-16T16:41:01.910 回答