2

私はクラスを持っています:

 public class LockTest
 {
    public void LockThis()
    {
        lock (this)
        {
            Console.WriteLine("lock this test");
            System.Threading.Thread.Sleep(5000);
        }
    }

 }

メインで:

 static void Main(string[] args)
 {
LockTest lockTest = new LockTest();

lock (lockTest)
{
        //lockTest.LockThis();
        System.Threading.Thread thread = new Thread(lockTest.LockThis);
        thread.Start();
}
Console.Read();
}

lockTest.LockThis() を呼び出すとデッドロックが発生すると思いましたが、そうではありませんでした。理由はわかりません。

4

3 に答える 3

4

ここでの説明はタイミングです。

スレッドを開始するコードは、スレッドが完全に開始され、ロックを取得しようとするポイントに到達する前にMain、なんとかロックをエスケープします。

Console.Read行をブロックに移動してみてくださいlock。私の言いたいことがわかるでしょう。

また、メソッドがロックをエスケープする前にスレッドがロック コードに到達できた場合でもMain、それが発生するのを単に待機し (メイン スレッドがロックをエスケープするのを待機)、その後続行することに注意してください。

したがって、ここにはデッドロックはまったくありませ

デッドロックとは、2 つのスレッドが互いに待機している場合、または同様の状況です。このコードにはそれがありません。

于 2013-09-14T09:31:20.500 に答える
2

このコードにデッドロックはあり得ません。

スレッドLockThisが開始されると、ロックはメインスレッドによって所有されるため、開始されてから待機します。メイン スレッドは続行し、ロックを終了します ( の前の行Console.Read)。この時点で、LockThisスレッドは続行できます。デッドロックなし。

Main Thread     LockThis
lock            (not started)
start LockThis
                try lock, failure, goes in wait
unlock
Console.Read()
                awakened because the lock is free
                lock
                unlock

別のシナリオ: メイン スレッドがスレッドを開始しLockThisます。その後、メイン スレッドは続行し、LockThis スレッドが動作を開始する前、つまりロックに入ろうとする前にロックを終了します。このシナリオでもデッドロックはありません。

Main Thread      LockThis
lock             (not started)
start LockThis
unlock
                 lock
Console.Read()
                 unlock

(どちらの場合も、LockThis のロック解除の位置は関係ないことに注意してください。上下に移動できます)

ウィキを見ると、デッドロックが発生するために必要なことがわかります

少なくとも 2 つのリソースを共有不可にする必要があります。

ここにはリソースが 1 つしかありません ( lock (lockTest))。

于 2013-09-14T09:31:32.497 に答える
0

スレッドが lockTest をロックする前に、lock(lockTest) ブロックを離れています。

于 2013-09-14T09:32:00.817 に答える