我已经被挖掘出来支持一些遗留代码,并且我看到一些让我在困惑中挠头的东西。在代码的某些部分,我看到类实例使用CMutex实例来同步方法执行。例如CMutex :: Lock与CSingleLock :: Lock
class CClassA : public CObject
{
public:
void DoSomething();
private:
CMutex m_mutex;
}
void CClassA::DoSomething()
{
m_mutex.Lock();
//...logic...
m_mutex.Unlock();
}
其他地方在同一个项目中,我发现代码使用CSingleLock
class CClassB : public CObject
{
public:
void DoSomething();
private:
CCriticalSection m_crit;
}
void CClassB::DoSomething()
{
CSingleLock lock(&m_crit);
lock.Lock();
//...logic...
lock.Unlock();
}
审查MSDN documentation for synchronization后,它会出现CClassB正在实施的建议方法,但它不是清楚了CClassA所使用的实施过程中的危险。据我所知,这两种方法之间的唯一区别是CSingleLock具有RAII的优点,所以当执行退出范围时锁会自动释放。这两种实施是否还有其他优点/缺点?
要添加一些上下文,我的一个担心是如果使用CSingleLock :: Lock具有细微差别的行为。例如,在同一个线程可能能够多次调用CMutex :: Lock(因为它已经拥有该锁)的情况下,在CSingleLock的同一个实例上对CSingleLock :: Lock的调用将被阻塞。我也担心我可能遇到一个情况,即CSingleLock正在管理一个CCriticalSection,但该CCriticalSection具有直接调用的Unlock方法。 – JadeMason 2011-05-19 18:41:38