2016-08-02 8 views
0

私はSOとWebを見て回ってきましたが、他の言語(C++、Python)でしか見つかりませんでした。スレッドが死んだ場合のロック状態

スレッドがロックされたコードブロックを持ち、ロックされたブロックの内部にある間に何らかの理由で(強制的に)スレッドが死んでも、ロックは強制されます(つまり、そのロックを取得することができますか?)このように

class myClass { 
    private static object myLock = new Object(); 

    public void foobar() 
    { 
     lock(myLock) 
     { 
      //code 
     } 
    } 
} 

スレッドAが死亡し、スレッドBがfoobarのを呼び出そうとした場合、それができるようになりますか?それともデッドロックですか?

+0

"私はSOとウェブの周りを見て答えました" - あなたのお気に入りの検索エンジンで "c#lock exception"を検索しようとします。 – Dennis

+0

が編集されました。私はこれが重複しているとは思わない。私は例外部分を削除しましたが、スレッド自体がロックされている間は例外なく、スレッド自体が消滅した場合に何が起こるかにもっと興味があります。スレッドが強制終了されると、ロックは解除されますか? –

答えて

0

lockステートメントは、以下に示すようにMonitor.Enter Monitor.Exitの組み合わせでtry-finallyに変換され、最後に、例外が発生した場合でもロックが解除された場合でも実行されます。このanswerからEric Lippertは、C#のロック実装を説明しています。

System.Threading.Monitor.Enter(x); 
try { 
    ... 
} 
finally { 
    System.Threading.Monitor.Exit(x); 
} 
0

声明

lock(myLock) 
{ 
    //code 
} 

スレッドが死んだ場合、例外がスローされるだろうとfinally文がオブジェクトmyLockからロックを解除しまうので

System.Threading.Monitor.Enter(myLock); 
try 
{ 
    //code 
} 
finally 
{ 
    System.Threading.Monitor.Exit(myLock); 
} 

に相当します。

Monitor classのドキュメントを参照してください。ロックの概念についての説明とサンプルがあります。

関連する問題