プログラムのデッドロックを回避するための一般的な方法やルールはありますか? また、そのようなシナリオを処理するための CLR または言語/フレームワークからの手段からのサポートはありますか?
3 に答える
これのほとんどは.net固有ではないことに注意してください。
デッドロックを回避する最大の方法は、一貫した順序でロックすることです。これは、デッドロックではなく定期的なブロックを取得することを意味しますが、何をいつロックするかについて多くの考慮と計画が必要です。もちろん、この考えと計画はとにかく必要です。
これを実現する簡単な方法の1つは、一度に1つのロックオブジェクトのみが必要になるようにすることです。したがって、AとBをロックする代わりに、AとBを(別々に)ロックします。これも考えと計画が必要ですが、通常は達成可能です。
より一般的に言えば、過度に粒状のロックを回避することは、ここでの大きな正気の節約になる可能性があります。競合する可能性のあるロックオブジェクトについては、両方の概念に1つのロックを使用することを真剣に検討してください。多くの場合、これは競合に費やす時間に大きな影響を与えませんが、コードをはるかに単純で信頼性の高いものにします。
実際、私がこの言語で持っている不満の1つは、「ロックを取得するがタイムアウトを使用する」は「ロックを取得する」よりもはるかにコード集約的であるということです。常にタイムアウトがあることを確認することで、完全なロックアップを回復可能にすることもできます。ただし、これは主に、間違った順序でロックされている領域を特定するために使用する必要があります。これにより、それらを修正できます。
MSDN には、実際にこのトピックに関する優れた記事がいくつかあります。
問題を回避する最善の方法は、通常の制御プロセスを使用することだと思います。ミューテックスまたはセマフォを使用してリソースへのアクセスを保護します。
これはあなたを助けるかもしれません
http://msdn.microsoft.com/en-us/library/hw29w7t1(v=vs.71).aspx