线程中死锁的问题
2010-10-13 11:11
288 查看
本篇是我学习线程中死锁问题的笔记,笔记如下:
(一)代码:
(二)运行截图:
(三)小结:
本篇学习了造成死锁的原因,并以一个实例模拟了死锁的情况,并给出了避免死锁大概方法。
方法为:
(1)设计好锁定顺序
(2)为锁定义超时时间
(一)代码:
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)为锁定义超时时间
相关文章推荐
- 调用TerminateThread终止线程所导致的死锁问题
- Linux环境下线程的同步与互斥以及死锁问题
- 黑马程序员------多线程(No.2)(死锁、线程间通信、生产者消费者问题)
- C# 线程的问题之:死锁
- 线程中的死锁问题
- DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
- 线程死锁问题
- java线程同步之死锁问题
- 线程死锁问题
- 任务,线程和同步(六)之线程问题:争用条件和死锁
- java线程安全之死锁问题
- java笔记:熟练掌握线程技术---基础篇之线程的协作和死锁的问题(下)
- dll中线程死锁的问题(收集的文章,资料)
- 关于MFC DLL CWinApp::InitInstance()中创建线程的问题 易造成死锁
- .NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长
- 关于线程死锁的问题
- java笔记:熟练掌握线程技术---基础篇之线程的协作和死锁的问题(下)
- 线程技术之死锁问题
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁