この記事は、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のソースを見つけることができません)。
ロックは何をすべきかについての彼の理解は、COMP - SCIの背景に基づいているようです彼の議論のトーンに基づいて、他のプラットフォームおよび/または実装からの同様の名前のロックの実装。 – Arafangion
彼はクリティカルセクション自体のためにCSingleLockと誤解しています。 CSingleLockはクリティカルセクション全体ではなく、1つのロックを管理します(また、RAIIを提供します)。 –
ああクール、+1。 :) – Arafangion