有人可以举例说明如何在C#语言中引起线程死锁吗?
答案 0 :(得分:36)
static object object1 = new object();
static object object2 = new object();
public static void ObliviousFunction()
{
lock (object1)
{
Thread.Sleep(1000); // Wait for the blind to lead
lock (object2)
{
}
}
}
public static void BlindFunction()
{
lock (object2)
{
Thread.Sleep(1000); // Wait for oblivion
lock (object1)
{
}
}
}
static void Main()
{
Thread thread1 = new Thread((ThreadStart)ObliviousFunction);
Thread thread2 = new Thread((ThreadStart)BlindFunction);
thread1.Start();
thread2.Start();
while (true)
{
// Stare at the two threads in deadlock.
}
}
答案 1 :(得分:6)
在比例的另一端, 单独的同步上下文 邀请死锁。这是一个例子:
[Synchronization]
public class Deadlock : ContextBoundObject {
public DeadLock Other;
public void Demo() { Thread.Sleep (1000); Other.Hello(); }
void Hello() { Console.WriteLine ("hello"); }
}
public class Test {
static void Main() {
Deadlock dead1 = new Deadlock();
Deadlock dead2 = new Deadlock();
dead1.Other = dead2;
dead2.Other = dead1;
new Thread (dead1.Demo).Start();
dead2.Demo();
}
因为死锁的每个实例都是 在Test中创建 - 一个 非同步类 - 每个实例 将获得自己的同步 上下文,因此,它自己的锁。什么时候 这两个物体相互呼唤, 没过多久就陷入僵局 发生(一秒钟,确切地说!) 问题尤其严重 如果死锁和测试阴险 课程由不同的人写成 编程团队。它可能是 期望那些是不合理的 负责Test类 我们甚至意识到他们的违法行为 独自知道如何解决 它。这与显性相反 锁,通常是死锁 更明显。