を破る:C#のロック復帰/ Iは、次のコードを持っている場合は継続/
lock(SyncRoot){ return value; }
をSyncRootのは、return文の前にアンロックされますか?
VS2005のコードを見てみましたが、実際には表示されません。ロックが解除されているように見えますが、確認したいと思います。
を破る:C#のロック復帰/ Iは、次のコードを持っている場合は継続/
lock(SyncRoot){ return value; }
をSyncRootのは、return文の前にアンロックされますか?
VS2005のコードを見てみましたが、実際には表示されません。ロックが解除されているように見えますが、確認したいと思います。
はいブロックをどのように終了しても(つまり、復帰、ブレーク、スローなど)ロックは解除されます。
詳細はMSDN - lock statement参照してください:ロックキーワード
は、別のスレッドがクリティカルセクションにありながら、一つのスレッドがコードのクリティカルセクションを入力していないことを保証します。
...
ロックキーワードはブロックの先頭にEnterを、ブロックの最後に を終了します。
はい、値を計算します(値が式であった場合、これが重要である可能性があります)。その後、ロックが解除されて戻ります。 lock()は、スコープを終了しても自動的にロック解除されます。
ブロック実行後にロックが解除されます。
この構文は、using
、btwと似ています。 lock
がブロックの外側にある唯一の理由は、開始時にロックがあり、終了時にロックが解除されていることを示すことです。
いいえ、ロックはの返信後にのみリリースされます。
はい、あなたはこのようなものに拡大し、それを考えることができます。
Monitor.Enter(obj);
try {
var result = value;
}
finally {
Monitor.Exit(obj);
}
return result;
生成されたILを見れば、それはそのようなものです。 value
が式であった場合、ロックを解除する前に評価されます。戻りは、ロックを解除した後に実行されます。
いずれにしてもfinallyブロックが呼び出されるため、ロックが解除されます。
lock
は、実際にはMonitor.Enter
/Monitor.Exit
をバックグラウンドで使用しています。あなたのコードの拡張バージョンは、この
Monitor.Enter (SyncRoot);
try
{
return value;
}
finally { Monitor.Exit (SyncRoot); }
finally
ブロックはメソッドが実際に返す前に実行されることが保証され、実際にあるので、ロックが解除されます。
「 int i = 0; オブジェクトo =新しいオブジェクト();
while (i < 100)
{
lock (o)
{
if (i == 10)
continue;
}
++i;
}`
それは
を続ける が前に前の実行 コンテキストから保存されたロックを獲得するために永遠に待ちます ので、これはデッドロックになります