這段代碼差異性之探源:CCriticalSection做什麼?
::EnterCriticalSection(&m_CriticalSection);
//...
::LeaveCriticalSection(&m_CriticalSection);
,代碼:
static CCriticalSection cs;
cs.Lock();
//...
cs.UnLock();
這段代碼差異性之探源:CCriticalSection做什麼?
::EnterCriticalSection(&m_CriticalSection);
//...
::LeaveCriticalSection(&m_CriticalSection);
,代碼:
static CCriticalSection cs;
cs.Lock();
//...
cs.UnLock();
沒有區別落到實處。 CCriticalSection
是唯一的合成糖前者。它內部使用EnterCriticalSection
和LeaveCriticalSection!
EnterCriticalSection
和LeaveCriticalSection
是低級別的Win32 API,而CCriticalSection
是MFC類它包裝這些功能。它有一個由API使用的類型爲CRITICAL_SECTION
的成員數據。
MSDN說,
的 CCriticalSection類的功能由 實際的Win32 CRITICAL_SECTION 對象提供。
它封裝CRITICAL_SECTION
結構和四個運算 - InitializeCriticalSection()
,EnterCriticalSection()
,LeaveCriticalSection()
和DeleteCriticalSection()
成一個類使其更方便地編寫代碼。
如果以這種方式使用,則沒有區別。對類的主要好處是,如果你使用它,如下所示:
static CCriticalSection cs;
{
CSingleLock lock(cs, true);
// do your work here
} // unlocked automatically
當範圍退出關鍵部分將被解鎖,即使拋出了一個異常或使用早期的回報。該技術被稱爲RAII(資源獲取初始化)並且廣爲人知。
MFC同步類的設計不是很好。如果你能掌握它們,我會推薦使用boost.thread或者新的C++標準。
據我瞭解的文檔,這將無法正常工作,因爲`CSingleLock`構造函數只會嘗試鎖定資源,如果您通過提供TRUE作爲第二個參數來專門詢問它的話。否則,你仍然需要手動調用`lock.Lock()`。 `cs.IsLocked()`似乎並不存在,你可能意味着`lock.IsLocked()`。無論哪種情況,該檢查可能不是必需的,因爲`CCriticalSection.Lock()`不會失敗。至少,這是我從文檔中獲得的。 – Medo42 2012-10-04 10:00:58