1

この 2 つのアプローチから選択するのに苦労しています。ここでの回答の多くは、どちらか一方を支持しています。自分の状況に最適なものを選択するためのガイダンスが必要です。

lock (lockObject)
lock (lockObject2) {
     // two critical portions of code
}

対:

lock (lockObject)
{
    //first critical portion for lockObject 
    lock (lockObject2) {
       //critical portion for lockObject2 and lockObject
    }
}

2 番目の例は、Coverity によって不適切な方法としてマークされています。問題がなければ最初の例に切り替えたいと考えています。

2 つのうちどちらが最適ですか (コードの品質と長期的に見て問題が少ないことを意味します)。なぜ?

編集 1: 最初のロックは、特にこの場合にのみ使用されます。

4

3 に答える 3

2

「最高」は主観的なものであり、文脈によって異なります。いずれかの問題の 1 つは、一部のコードが同じロックを異なる順序で使用すると、デッドロックが発生する可能性があることです。ネストされたロックがある場合、個人的には、少なくともタイムアウト付きのロックを使用します (そして例外を発生させます) - 例外はデッドロックよりも優れています。両方のロックをすぐに外すことの利点は、作業を開始する前に、ロックを取得できることがわかっていることです。そうしないことの利点は、ロックオンlockObject2が保持される時間を短縮できることです。

個人的には、私はそれを作る方法を探しています:

lock (lockObject) {
    //critical portion for lockObject
}
lock (lockObject2) {
    //critical portion for lockObject2
}

これには、どちらの欠点もなく、両方の利点があります-コードを再構築して実行できる場合。

于 2013-05-23T08:27:21.230 に答える
1

直面しているケースによって異なります。

  • 最初のロックが 2 番目のロックに触れることなく解放される可能性がある場合、2 番目のロックは使用されなければロックされないため、アプリケーションの速度が向上する可能性があります。
  • 常に両方のロックが使用される場合、読みやすさのために最初のケースを優先します

編集:これ以上の情報がなければ、これを伝えることはできないと思います. ロックをできるだけ短く保つには、できるだけ遅くロックする必要があります。いずれにせよ、両方のロックを同時に取得したい場合があるかもしれません。

于 2013-05-23T08:28:51.373 に答える
0

編集:私は間違ったことを言いました。1 つ目は最初のロックをロックし、次にコードの一部の 2 つ目のロックをロックしてから、自動的にロックを解除します。2 番目の例は、最初の部分をロックし、次に 2 番目をロックし、コードの両方の部分が終了し、両方のロックが解除されます。両方のロックが自動的に解除されるため、個人的には 2 番目のオプションをお勧めします。しかし、他の誰かがコメントしたように、デッドロックに注意してください。これは、別のスレッドが逆の順序でロックされている場合に発生する可能性があります。

于 2013-05-23T08:25:05.573 に答える