はい、どうぞ。
デッドロックの一般的な例は、複数のロックを取得し、2 つ以上のスレッドが相互に待機する場合です。
たとえば、次のようにロックする 2 つのスレッド:
Thread 1 Thread 2
Lock "A" Lock "B"
Lock "B" Lock "A" <-- both threads will stop dead here
waiting for the lock to be come
available.
ただし、この例ではそれを気にせず、1 つのスレッドを無期限にロックしただけです。ロックの制御を失いたくないので、これは不自然な例ですが、バックグラウンド スレッドがこのようにメイン スレッドを完全にブロックできるという事実は良くありません。
using System;
using System.Threading;
namespace ConsoleApplication7
{
public class Program
{
public static void Main(string[] args)
{
LockableClass lockable = new LockableClass();
new Thread(new ParameterizedThreadStart(BackgroundMethod)).Start(lockable);
Thread.Sleep(500);
Console.Out.WriteLine("calling Reset");
lockable.Reset();
}
private static void BackgroundMethod(Object lockable)
{
lock (lockable)
{
Console.Out.WriteLine("background thread got lock now");
Thread.Sleep(Timeout.Infinite);
}
}
}
public class LockableClass
{
public Int32 Value1 { get; set; }
public Int32 Value2 { get; set; }
public void Reset()
{
Console.Out.WriteLine("attempting to lock on object");
lock (this)
{
Console.Out.WriteLine("main thread got lock now");
Value1 = 0;
Value2 = 0;
}
}
}
}