2011-02-10 40 views
4

何このコードの間diffrence:CCriticalSectionの機能は何ですか?

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

やコード:

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

答えて

8

差は実質的に。 CCriticalSectionは、前者の唯一の構文の砂糖です。それ内部CCriticalSectionがこれらの機能をラップするMFCクラスであるEnterCriticalSectionLeaveCriticalSection!

EnterCriticalSectionLeaveCriticalSectionは、低レベルのWin32 APIを使用しています。 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(Resource Acquisition Is Initialization)と呼ばれ、広く知られています。

MFC同期クラスはうまく設計されていません。 boost.threadを使うか、新しいC++標準で使えるものを使うことをお勧めします。

+0

ドキュメントを理解する限り、 'CSingleLock'コンストラクタは、特に第2パラメータとしてTRUEを指定して要求するとリソースをロックしようとするため、これは機能しません。さもなければ 'lock.Lock()'を手動で呼び出さなければなりません。 'cs.IsLocked()'は存在しないようですが、おそらく 'lock.IsLocked()'を意味します。どちらの場合でも、 'CCriticalSection.Lock()'が失敗するとは考えられないので、おそらくそのチェックは必要ではありません。少なくとも、それは私がドキュメントから抜け出すものです。 – Medo42

+0

@ Medo42はすべての勘定科目について正しい。私は答えを修正しました。 – ymett

関連する問題