2010-12-06 25 views
3

私たちはMFCの初心者ですが、私たちは複数のアプリケーションを構築しています。 CCriticalSectionの実装が壊れているため、CCriticalSectionを使用しないように警告するURLの記事があります。私たちは誰でもCCriticalSectionの使用経験があり、問題やバグに遭遇したことがあるかどうかを知りたいですか? VC++ 2008を使用してアプリケーションを構築する場合、CCriticalSectionは使用可能で、プロダクション準備ができていますか?は生産で使用可能なCcriticalsectionですか?

http://www.flounder.com/avoid_mfc_syncrhonization.htm

記事では、これらのプリミティブを使用しての簡単な状況は、それらの実装は、それらの予想されなければならないのセマンティクスに違反することを除いて、罰金であることを示唆しているTHX

答えて

11

この記事は、CSingleLockの基本的な誤解とその使い方に基づいていると思います。

同じCSingleLockを複数回ロックすることはできませんが、あなたはそうではありません。その名前が示すように、CSingleLockは何かをロックするためのものです。

各CSingleLockは、CSingleLockが有効範囲外になったときにそのロックを自動的に解放する目的で、他のオブジェクト(たとえば、作成中に渡すCCriticalSection)に対して1つのロックを管理するだけです。

基になるオブジェクトを複数回ロックする場合は、複数のCSingleLockを使用します。 1つの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. 

(もちろん、あなたが意図的だろうそのような単一のブロック内の同じ基礎となるクリティカルセクションに2つのロックを取得します。これは通常、コールの結果としてのみ発生します既に独自のロックを持っているものの中でロックを取得する関数)。

(また、ロックが成功したかどうかを確認するには、CSingleLock.IsLockedをチェックする必要があります。これらのチェックを省略したのは、元の例から除外されているためです。

CCriticalSection自体が同じ問題を抱えている場合は、確かに問題になりますが、見ることができます。 (多分私は何かを逃した。私は、その方法を確認するには、私のMFCのインストールでCCriticalSectionのソースを見つけることができません)。

+0

ロックは何をすべきかについての彼の理解は、COMP - SCIの背景に基づいているようです彼の議論のトーンに基づいて、他のプラットフォームおよび/または実装からの同様の名前のロックの実装。 – Arafangion

+1

彼はクリティカルセクション自体のためにCSingleLockと誤解しています。 CSingleLockはクリティカルセクション全体ではなく、1つのロックを管理します(また、RAIIを提供します)。 –

+0

ああクール、+1。 :) – Arafangion

0

基本的には、非再帰的なロックとして使用すると、ロックが有効である(つまり、放棄されていない)ことを常に気にしていることが示唆されます。

ただし、この制限は使用できないと訴えています。

関連する問題