【发布时间】:2013-10-16 16:34:41
【问题描述】:
我尝试用我自己的替换 MFC 的 CSingleLock 实现,但我现在在 Windows XP 上遇到了死锁,而我在 Windows 7 上没有这种死锁,而且我在任何带有 MFC 的 CSingleLock 的操作系统上都没有,除了查看每个在我的应用中锁定和解锁,我的实现中缺少什么:
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();
}
};
【问题讨论】:
-
1有什么理由不使用 ATL/MFC 类CComAutoCriticalSection和朋友?2第二类是不准确的,例如它可能会发生你解锁而不锁定。方便的助手类不是这样设计的。 -
@RomanR。如果我从事非商业项目,我会避免使用 ATL/MFC,因为它们不附带 VS Express。 (反正他们从来没有用过,我还没有在 VS 2012 中检查过。)
-
因为我被要求从使用它们的库中获取 MFC/ATL ......我已经这样做了,在 Windows 7 上工作时,现在我遇到了这个问题在 XP 上测试时。
-
您没有发布导致问题的代码。上面的类并不健壮,如果使用不当,它们可能会导致问题。您需要查看更高级别的代码。一个典型的问题是解锁从不锁定的部分,并删除锁定的部分。一个更好的班级会得到
asserts 来报告这个。
标签: windows multithreading winapi visual-c++ mfc