0

マルチスレッド アプリケーションのどのスレッドも、任意の時点で複数のロックを取得することがなく、そのようなロックが常にある時点で解放される場合、デッドロックが発生する可能性はありますか?

答えは「いいえ」だと思います-別のスレッドが利用できないロックを必要とする場合、他のスレッドの実行を妨げるロックを保持せず、必要なロックが利用可能になるまでブロックします-本当ですか?

その場合、どの時点でデッドロックが可能になりますか? たとえば、1 つを除くすべてのスレッドが一度に複数のロックを取得しない場合、デッドロックが発生する可能性がありますか? 個人的には方法がわかりません。

古典的なデッドロックのケースは、あるスレッドがロック A を持っているがロック B を必要とし、別のスレッドがロック B を持っていてロック A を必要とする場合です。

4

2 に答える 2

1

オペレーティング システムの高度な概念からの抜粋

デッドロックが発生するには、次の 4 つの条件が必要です。

1.排他的アクセス - リソースへの単一アクセス

2.待機中 - すでに 1 つ以上のリソースがある場合に、別のリソースを待機します。

3.プリエンプションなし - リソースを解放する唯一の方法は、プロセスを終了させることです

4.循環待機 - 必要なリソースに循環依存があります

上記の 4 つの条件をすべて満たしている場合、システムはデッドロックを起こしやすい

あなたが言及したケースは、リソースに対するリクエストが1つしかない1つのリクエストモデルであり、リソースはある時点で解放されるため、待機と保留はありません。したがって、デッドロックはありません

ただし、2 つ以上のリソースが要求された場合は、上記のすべての条件を満たす方法が複数ある可能性があります。

あなたが提示した例は、循環待機の典型的なケースです。1 つの解決策は、階層を使用することです。つまり、ロック B の前にロック A を取得します。これにより循環待機が防止されます。

より多くのアイデアを読んで、リクエストモデル、またはリクエストモデル、P OUT OF Qリクエストモデル、そしてもちろん1つのリクエストモデルを取得することをお勧めします

于 2013-02-25T04:55:30.753 に答える
0

あるスレッドがロックし、別のスレッドが同じロック オブジェクトのロックを取得しようとしているが、最初のスレッドがそのロックを解放しない場合、デッドロックが発生する可能性があります (おそらく、最初のスレッドが 2 番目のスレッドによって設定されなければならない条件を待っているため) 、しかし 2 番目のスレッドはロックを取得できないため、その条件を設定することはありません)。

ご覧のとおり、意図的にデッドロックを作成することは、実際には非常に簡単なことです。

于 2013-02-24T21:53:25.547 に答える