这篇文章主要介绍“C#多线程死锁实例代码分析”,在日常操作中,相信很多人在C#多线程死锁实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#多线程死锁实例代码分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、死锁简介
在多道程序设计环境下,多个进程可能竞争一定数量的资源,。一个进程申请资源,如果资源不可用,那么进程进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待的进程有可能无法改变状态,这种情况下称之为死锁。
二、死锁条件
死锁的四个条件:
非抢占:资源不能被抢占
2.互斥:至少有一个资源必须处在非共享模式,即一次只能有一个进程使用,如果另一进程申请该资源,那么申请进程必须延迟直到该资源释放为止。
3.占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。
4.循环等待:有一组进程{P0,P1,…Pn},P0等待的资源被P1占有,P1等待的资源被P2占有,Pn-1等待的资源被Pn占有,Pn等待的资源被P0占有。
形成死锁必须要满足这四个条件。那么违背这几个条件中的任何一个就不会形成死锁,这种方式成为 死锁预防,而死锁避免是动态的检测分配资源的状态是否安全。
三、解决办法
我们可以通过对锁加时效性,或者死锁检测来处理。
Monitor.TryEnter()方法。虽然这种方法可以解决死锁问题,但是最好还是不要出现死锁这种情况。
死锁案例代码
如下代码实现创建两个线程t1和t2,分别起初分配占用lock1和ock2资源。当一个线程t1占用资源lock1时,再去请求另外一个资源lock2时,此时由于另外一个线程t2在正占用资源t2,请求失败,等待释放资源。同时t2又发出请求资源lock1,但是lock1又被t1占用,没有释放,也只能进行等待。此时两个线程只能等待一直等待对方释放资源,这就称之为死锁。
namespace Deadlock{ class DL { int field1 = 0; int field2 = 0; private object lock1 = new int[1]; private object lock2 = new int[1]; public void First(int val) { lock (lock1) { Console.WriteLine("First: Acquired lock 1: " + Thread.CurrentThread.GetHashCode() + " Now Sleeping."); //Try commenting Thread.Sleep() Thread.Sleep(1000);//此时t2线程占用资源 Console.WriteLine("First: Acquired lock 1: " + Thread.CurrentThread.GetHashCode() + " Now wants lock2."); //当请求锁lock2时,lock被t2线程占用,等待释放 lock (lock2) { Console.WriteLine("First: Acquired lock 2: " + Thread.CurrentThread.GetHashCode()); field1 = val; field2 = val; } } } public void Second(int val) { lock (lock2) { Console.WriteLine("Second: Acquired lock 2: " + Thread.CurrentThread.GetHashCode()); //当请求锁lock1时,lock1被t1线程占用,等待释放 lock (lock1) { Console.WriteLine("Second: Acquired lock 1: " + Thread.CurrentThread.GetHashCode()); field1 = val; field2 = val; } } } } public class MainApp { DL d = new DL(); public static void Main() { MainApp m = new MainApp(); Thread t1 = new Thread(new ThreadStart(m.Run1)); t1.Start(); Thread t2 = new Thread(new ThreadStart(m.Run2)); t2.Start(); Console.ReadLine(); } public void Run1() { this.d.First(10); } public void Run2() { this.d.Second(10); } }}
到此,关于“C#多线程死锁实例代码分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!