写点什么

急速学习 C#死锁

作者:喵叔
  • 2022 年 1 月 08 日
  • 本文字数:771 字

    阅读完需:约 3 分钟

急速学习C#死锁

一、什么是死锁

死锁指的是两个或两个以上的线程各自持有对方所需的资源,并一直等待对方释放资源,进而导致所有线程都在等待,那么每个线程都无法释放占用的资源,这样就产生了死锁。常见的情况就是 C 端的 UI 线程发生死锁,导致界面停止响应无法工作。举个例子,小明和小红在饭店吃饭,桌子上有两道菜,每道菜都有一双公筷,并且每道菜只能用指定的公筷夹取,只有在公筷放在桌子上的情况下,他们才能吃到菜。但是他们两个人分别拿着两道才的公筷不放下,都在等待对方放下公筷去吃另一道菜,这时就产生了死锁。我们将这个例子代码化,如下:


public static void Demo(){  var xhTask= new Task(    () =>    {      //等待小明放下筷子      eventXm.WaitOne();      //小红放下筷子      eventXh.Set();    }  );  var xmTask = new Task(    () =>    {      //等待小红放下筷子      eventXh.WaitOne();      //小明放下筷子      eventXm.Set();    }  );  Parallel.Invoke(() => xhTask.Start(),() => xm.Task.Start());  xhTask.Wait();  xmTask.Wait();}
复制代码

二、如何解决

如果要解决这个问题,有四种方法:


  1. 破坏互斥条件;

  2. 破坏环路等待条件;

  3. 破坏不剥夺条件;

  4. 破坏请求和保持条件。


一般来说常用的方法是方法四,修改后的代码如下:


public static void Demo(){  var xhTask= new Task(    () =>    {      //等待小明放下筷子,等待时间不超过5秒      eventXm.WaitOne(5000);      //5秒后小红放下筷子      eventXh.Set();    }  );  var xmTask = new Task(    () =>    {      //等待小红放下筷子,等待时间不超过5秒      eventXh.WaitOne(5000);      //5秒后小明放下筷子      eventXm.Set();    }  );  Parallel.Invoke(() => xhTask.Start(),() => xm.Task.Start());  xhTask.Wait();  xmTask.Wait();}
复制代码


发布于: 刚刚阅读数: 2
用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
急速学习C#死锁