2011-02-10 131 views
4

這段代碼差異性之探源:CCriticalSection做什麼?

::EnterCriticalSection(&m_CriticalSection); 
//... 
::LeaveCriticalSection(&m_CriticalSection); 

,代碼:

static CCriticalSection cs; 
cs.Lock(); 
//... 
cs.UnLock(); 

回答

8

沒有區別落到實處。 CCriticalSection是唯一的合成糖前者。它內部使用EnterCriticalSectionLeaveCriticalSection!

EnterCriticalSectionLeaveCriticalSection是低級別的Win32 API,而CCriticalSection是MFC類它包裝這些功能。它有一個由API使用的類型爲CRITICAL_SECTION的成員數據。

MSDN說,

的 CCriticalSection類的功能由 實際的Win32 CRITICAL_SECTION 對象提供。

2

它封裝CRITICAL_SECTION結構和四個運算 - InitializeCriticalSection()EnterCriticalSection()LeaveCriticalSection()DeleteCriticalSection()成一個類使其更方便地編寫代碼。

7

如果以這種方式使用,則沒有區別。對類的主要好處是,如果你使用它,如下所示:

static CCriticalSection cs; 
{ 
    CSingleLock lock(cs, true); 
    // do your work here 
} // unlocked automatically 

當範圍退出關鍵部分將被解鎖,即使拋出了一個異常或使用早期的回報。該技術被稱爲RAII(資源獲取初始化)並且廣爲人知。

MFC同步類的設計不是很好。如果你能掌握它們,我會推薦使用boost.thread或者新的C++標準。

+0

據我瞭解的文檔,這將無法正常工作,因爲`CSingleLock`構造函數只會嘗試鎖定資源,如果您通過提供TRUE作爲第二個參數來專門詢問它的話。否則,你仍然需要手動調用`lock.Lock()`。 `cs.IsLocked()`似乎並不存在,你可能意味着`lock.IsLocked()`。無論哪種情況,該檢查可能不是必需的,因爲`CCriticalSection.Lock()`不會失敗。至少,這是我從文檔中獲得的。 – Medo42 2012-10-04 10:00:58