5

デッドロックを回避するために誰かが従うべきベストプラクティス/イディオムは何ですか?

4

6 に答える 6

9

デッドロックの一般的な理由は何ですか?を参照してください。

于 2009-06-25T13:30:20.690 に答える
7

デッドロックが発生するために発生しなければならない4つの条件があります。

  1. 相互排除条件:一度に複数のプロセスで使用できないリソース

  2. 保留および待機条件:すでにリソースを保持しているプロセスが新しいリソースを要求する場合があります

  3. プリエンプション条件なし:リソースを保持しているプロセスからリソースを強制的に削除することはできません。リソースは、プロセスの明示的なアクションによってのみ解放できます。

  4. 循環待機条件:2つ以上のプロセスが循環チェーンを形成し、各プロセスがチェーン内の次のプロセスが保持するリソースを待機します

これらの少なくとも1つ、できればそれ以上を避けてください。そうすれば、あまり多くの問題が発生することはありません。

于 2009-06-25T20:39:08.980 に答える
4

デッドロックを回避するために、いわゆるバンカーのアルゴリズムがあります。また、デッドロックを解消するために番犬の使用を検討することもできます。ここにもいくつかの興味深い点があります。

于 2009-06-25T13:47:45.880 に答える
1

デッドロックを回避するための標準的な手法は、ロック階層を設定することです。すべてのスレッドが同じ順序でロックまたは他のリソースを取得することを確認してください。これにより、スレッド1がロックAを保持してロックBを必要とし、スレッド2がロックBを保持してロックAを必要とするデッドロックシナリオを回避できます。ロック階層では、両方のスレッドが同じ順序でロックを取得する必要があります(たとえば、Bの前にA)。 。

于 2009-06-25T13:37:40.300 に答える
0

ベストプラクティスは、スレッドのクラスを定義し、スレッドでこのクラスの非静的フィールドのみを使用して、スレッドがメモリを共有しないようにすることです。
もちろん、デッドロックを回避するために、セマフォ、クリティカルセクション、およびミューテックスの使用を回避することもできます。デッドロックを回避したい場合は、少ない方が良いです。残念ながら、これらは、メモリまたはその他のリソースが2つのスレッド間で共有されている場合に必要です。そうでない場合、データが破損するリスクがあります。

于 2009-06-25T13:51:12.020 に答える
-2

クリティカルセクションに入るさまざまな方法の中で、セマフォとミューテックスが最も人気があります。

  • セマフォは待機メカニズムであり、ミューテックスはロックメカニズムであり、概念はほとんどの場合混乱を招きますが、要するに、ミューテックスをアクティブ化するスレッドはそれを非アクティブ化することしかできません。これを考慮して...

  • プロセスがリソースの一部をロックすることを許可しないでください。プロセスに5つのリソースが必要な場合は、すべてが使用可能になるまで待ちます。

  • ここでセマフォを使用すると、他のスレッドが占有しているリソースのブロックを解除/待機を解除できます。これは、プリエンプションが別の理由であることを意味します。

私によると、これら2つは基本的な条件であり、一般的な4つの注意事項の残りの2つはこれらに関連している可能性があります。

同意しない場合は、psにコメントを追加してください。私はすでに遅れています。後で、より明確で明確な説明を追加します。

于 2009-06-29T12:12:51.377 に答える