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(); } } }
相关文章推荐
- C# Winform 界面线程的Invoke死锁,以及Application.DoEvent的问题
- c# 通讯死锁问题 线程同步问题
- 线程问题——同步和死锁
- 深入学习理解java:高效的解决死锁问题的线程通讯方式:Semaphore 和 BlockingQueue
- C# winform 控件间线程更新问题处理方法
- Java总结(十)—实现Runnable接口创建线程,线程安全同步,死锁(哲学家进餐问题),读写锁
- c#线程问题:线程间操作无效:从不是创建控件 的线程访问它InvalidOperationException异常
- 线程死锁问题
- C# 4.0 “修复了”死锁问题
- C#的线程类之Thread类以及对为什么设置线程优先级却不先执行这一问题本身的认识
- 转:C#中跨线程访问控件问题解决方案
- 线程死锁 解决共享资源问题
- C#线程系列(4):同步与死锁
- java笔记:熟练掌握线程技术---基础篇之线程的协作和死锁的问题(下)
- c#多窗体之间线程问题
- 黑马程序员------多线程(No.2)(死锁、线程间通信、生产者消费者问题)
- 【面经笔记】线程、多线程 - 死锁、读写、消费者问题、TLS【续2】
- 使用Java thread dump分析CPU高使用率和线程死锁问题
- 线程死锁问题
- C#中跨线程访问控件问题解决方案