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();
}
};