您的位置:首页 > 其它

线程中死锁的问题

2010-10-13 11:11 288 查看
本篇是我学习线程中死锁问题的笔记,笔记如下:

(一)代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//添加命名空间
using System.Threading;
using System.Diagnostics;

namespace DeathLock
{
//死锁产生的原因:由于两个线程都在等待对方,就出现了死锁,线程将无限等待下去。
class Program
{
static void Main(string[] args)
{
//实例化2个StateObject对象,并传递给SampleThread类的构造函数,并创建2个线程
//其中一个线程运行ReadLock1(),另一运行方法ReadLock2()
StateObject state1 = new StateObject();
StateObject state2 = new StateObject();
Thread thread1 = new Thread(new SampleThread(state1, state2).ReadLock1);
thread1.Start();
Thread thread2 = new Thread(new SampleThread(state1, state2).ReadLock2);
thread2.Start();

}
}

public 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;
}

}

//死锁原因分析:
//方法DeadLock1()和DeadLock2()现在改变两个对象s1,s2的状态.这就进行了2个锁定.
//方法DeadLock1()先锁定s1,接着锁定s2,方法DeadLock2()先锁定s2,接着锁定s1
//现在有可能方法DeadLock1()中s1的锁定会被解除,接着出现一次线程切换,DeadLock2()开始运行,并锁定s2
//第二个线程现在等待s1锁定解除.因为需要等,所以线程调度器再次调度第一个线程.
//但第一个线程在等待s2锁定的解除。这个两个线程都在等待,只要锁定块没有结束,就不会解除锁定。
//这是一个典型的死锁。

public class SampleThread
{
private StateObject s1;
private StateObject s2;
public SampleThread(StateObject s1, StateObject s2)
{
this.s1 = s1;
this.s2 = s2;
}
public void ReadLock1()
{
int i = 0;
while (true)
{
lock (s1)
{
lock (s2)
{
s1.ChangeState(i);
s2.ChangeState(i++);
Console.WriteLine("still running,{0}", i);
}
}
}
}
public void ReadLock2()
{
int i = 0;
while (true)
{
lock (s2)
{
lock (s1)
{
s1.ChangeState(i);
s2.ChangeState(i++);
Console.WriteLine("still running,{0}", i);
}
}
}
}
//运行结果是:
//程序运行了许多循环,不久就没有响应了。“仍在运行”的信息仅在控制台上写了几次。
//死锁问题的发生频率也取决于系统配置,每次运行的结果都不同
//避免死锁的办法:
//(1)设计好锁定顺序
//(2)为锁定义超时时间
}
}


(二)运行截图:



(三)小结:

本篇学习了造成死锁的原因,并以一个实例模拟了死锁的情况,并给出了避免死锁大概方法。

方法为:

(1)设计好锁定顺序

(2)为锁定义超时时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: