私のアプリケーションでは、いくつかのオブジェクトへのアクセスをシリアル化する必要があるロックのコレクションを管理しています(各オブジェクトにロックが割り当てられています)。このロックのコレクション(ロックマネージャ)はスレッドセーフな方法で維持する必要があります(新しいロックが追加されます/古いロックはシリアル化を必要とする新しいオブジェクトが追加/削除されると削除されます)。二行を入れ替えるロックを解除して別のアトミックに取得する方法
LockManager.Lock();
var myLock = LockManager.FindLock(myObject);
LockManager.Unlock(); // atomic
myLock.Lock(); // atomic
は良い解決策ではありません: アルゴリズムは、このような何かを動作します。 myLock
のロックがブロックされた場合、これはまた、LockManager
のロック解除をブロックして、他のロックの要求をブロックします。
私が必要とするのは、2つのマークされた行がアトミックに実行されることです。これを達成する方法はありますか?
マネージャをロック解除する前にロックを解除するのはなぜですか? – CodesInChaos
別のロックを使用するだけではいかがですか?理性的なロック。 – CodingBarfield
@CodeInChaos: 他のロックブロックの場合、最初のロックの解除もその期間中ブロックされます。 –