我已經被挖掘出來支持一些遺留代碼,並且我看到一些讓我在困惑中撓頭的東西。在代碼的某些部分,我看到類實例使用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