0

順序付けられたロックパターンは、ReaderWriterLock(またはReaderWriterLockSlim)で使用した場合にデッドロックを防ぎますか?

明らかに、このパターンはミューテックスによるデッドロックを防ぎます。複数のリソースを((読み取りロック付きのNリソース)および(書き込みロック付きの1つまたは2つのリソース))でロックしている場合でも、デッドロックは防止されますか?

例:(太字の数字は書き込みロックのあるリソースを表します)

1 2 3 4 5

2 3 4

1 4 5

4

3 に答える 3

1

tl; drリソースの順序付けにより、リーダー/ライターロックのデッドロックも防止されます。

長い答え:

次のような待機グラフを描画します。

まず、すべてのリソースの頂点を左から右に所定の順序で描画します。

次に、リソースを待機しているプロセスごとに、待機中のリソースの頂点の直前に頂点を描画します。プロセスがリソースを待機していない場合は、すべてのリソース頂点の後に、右端に頂点を描画します。

次に、各プロセスからそのプロセスが待機しているリソースにエッジを描画し、各リソースから現在そのリソースを保持しているプロセスにエッジを描画します。

グラフの各エッジを検討してください。2つのケースがあります:

  • エッジはPi -> Ri、つまり、プロセスからリソースへです。各プロセスは1つのリソースのみを待機しており、待機しているリソースのすぐ左側にプロセスの頂点を描画しているため、エッジは左から右になります。

  • エッジはRi -> Pj、つまり、リソースからプロセスへです。リソースを待機していない場合Pj、その頂点はすべてのリソースの右側にあるため、エッジは左から右になります。プロセスが順番にリソースを取得するため、Pj が待機している場合は、。の場合、はの左側にあり、すぐ左側にあります(そのようにグラフを描画したため)。したがって、の左側にあるため、エッジは再び左から右になります。Rki < ki < kRiRkPjRkRiPj

このように描かれたグラフのすべてのエッジは左から右であるため、グラフのトポロジカルソートを作成しました。したがって、グラフにはサイクルがなく、デッドロックは発生しません。

重要なのは、プロセスが待機する理由ではなく、プロセスが待機するという事実であることに注意してください。したがって、ミューテックス、読み取り/書き込みロック、セマフォなどを待機するかどうかは関係ありません。デッドロック防止のためのこの戦略は、すべての人に有効です。

于 2011-11-09T13:37:07.677 に答える
0

順序付きロックパターンを間違って実行していると思います。すべてのロックを順番に取得する必要があります。「4」の書き込みロックを取得するには、最初に「3」の書き込みロックを取得する必要があります。「5」の場合、「3」と「4」「5」の書き込みロックを取得する必要があります。

通常のロックでは、順序付けられたロックパターンは高価ですが、SRWロックでは、最初にすべてのリーダーを破棄する必要があるため、非常に高価です。SRWロックは、アクセスの少なくとも80%以上が書き込みロックを必要としない場合にのみ利点になることを忘れないでください。それ以外の場合は非常にコストがかかり、単純なロックを使用するとはるかに優れた結果が得られます。

ただし、さらに良いのは、順序付けられたロックが不要になるようにコードを分離することです(つまり、「3」と「4」のデータに同時にアクセスする必要がありません)。これが常に可能であるとは限りませんが、これを実行できるほど、コードは単純になります。

于 2011-01-20T17:29:04.687 に答える
0

ロックが固定された順序で取得されているかどうかをチェックするC#での順序付きロックの実装を試みました。http://www.codeproject.com/Tips/563154/OrderedLock-in-Csharpを参照してください

于 2013-03-19T03:34:06.473 に答える