我認爲這篇文章是基於對CSingleLock的基本誤解以及如何使用它。
您無法多次鎖定相同的CSingleLock,但您不應該這樣做。正如其名稱所示,CSingleLock用於鎖定某件事。
每個CSingleLock只管理其他對象上的一個鎖(例如,在構建過程中傳遞它的CCriticalSection),目的是在CSingleLock超出範圍時自動釋放該鎖。
如果要多次鎖定底層對象,則可以使用多個CSingleLock;你不會使用單個CSingleLock並嘗試多次鎖定它。
錯誤(他的例子):
CCriticalSection crit;
CSingleLock lock(&crit);
lock.Lock();
lock.Lock();
lock.Unlock();
lock.Unlock();
右:
CCriticalSection crit;
CSingleLock lock1(&crit);
CSingleLock lock2(&crit);
lock1.Lock();
lock2.Lock();
lock2.Unlock();
lock1.Unlock();
更妙的(所以你得到RAII):
CCriticalSection crit;
// Scope the objects
{
CSingleLock lock1(&crit, TRUE); // TRUE means it (tries to) locks immediately.
// Do stuff which needs the lock (if IsLocked returns success)
CSingleLock lock2(&crit, TRUE);
// Do stuff which needs the lock (if IsLocked returns success)
}
// crit is unlocked now.
(當然,你決不會有意像這樣在一個塊中的同一底層關鍵部分獲得兩個鎖。通常只會發生在調用的結果中這些函數在已經擁有自己的鎖的其他東西內部獲取鎖的函數)。
(此外,您應該檢查CSingleLock.IsLocked以查看鎖是否成功。爲了簡潔起見,我已經將這些支票離開了,因爲它們被排除在原始示例之外。)
如果CCriticalSection本身遭受同樣的問題,那肯定是一個問題,但他沒有提供證據表明我可以看到。 (也許我錯過了一些東西,在我的MFC安裝中找不到CCriticalSection的源代碼來驗證這種方式)
他對鎖應該做什麼的理解似乎基於comp-sci背景或基於他的論點的語氣來實現來自其他平臺和/或實現的類似命名的鎖。 – Arafangion 2010-12-06 12:24:49