您的位置:首页 > 编程语言 > C#

C# 线程的问题之:死锁

2010-06-26 20:21 351 查看
using System;
using System.Threading;
using System.Diagnostics;

namespace ConsoleApplication1
{
class StateObject
{
private int state = 5;

public void ChangeState(int loop)
{
if (state == 5)
{
state++;
Trace.Assert(state == 6, "Race condition occurred after" + loop + " loops");
}

state = 5;
}
}

class SampleThread
{
private StateObject s1;
private StateObject s2;

public SampleThread(StateObject s1, StateObject s2)
{
this.s1 = s1;
this.s2 = s2;
}

/* 由于Deadlock1(),Deadlock2()中方法定义的锁定对象的顺序不同最终导致了死锁 */
public void Deadlock1()
{
int i = 0;

while (true)
{
lock (s1)
{
lock (s2)
{
s1.ChangeState(i);
s2.ChangeState(i++);

Console.WriteLine("运行," + i);
}
}
}
}

public void Deadlock2()
{
int i = 0;

while (true)
{
lock (s2)
{
lock (s1)
{
s1.ChangeState(i);
s2.ChangeState(i++);

Console.WriteLine("运行," + i);
}
}
}
}
}

class Program
{
static void Main(string[] args)
{
/* 死锁
* 至少有两个线程被挂起,等待对方解除锁定
* 线程将无限等待下去
*/
StateObject state1 = new StateObject();
StateObject state2 = new StateObject();

//此程序中第一个线程如果先锁定s1,同时第二个线程先锁定s2
//然后第一个线程在企图锁定s2时,发现s2已被锁定,于是开始等待s2解锁
//同时第二个线程企图锁定s1时,发现s1已被锁定,于是开始等待s1解锁
//但对于线程一来说如果s2不解锁,其也无法完成程序,对于线程二也是如此
//于是无穷的互相等待解锁开始了,死锁开始啦!

//避免死锁,可以从一开始定义好锁定的顺序,也可以为锁定定义超时时间^-^
new Thread(new SampleThread(state1, state2).Deadlock1).Start();
new Thread(new SampleThread(state1, state2).Deadlock2).Start();
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: