博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
死锁的产生与检测
阅读量:7027 次
发布时间:2019-06-28

本文共 3077 字,大约阅读时间需要 10 分钟。

产生死锁

    在操作系统中,我们可能接触过两个进程争抢资源,互不相让,然后产生了死锁,这时候,我们可以用银行家算法来分配资源。下面,我们先模拟产生死锁:

#region 试图产生死锁的代码        //    static void T1(Program p)        //{        //    //主线程占有了mainRes并试图访问workerRes;        //    lock (p.mainRes)        //    {        //        Thread.Sleep(10);//        //        lock (p.workerRes)  //死锁        //        {        //            Console.WriteLine(p.workerRes.Data);        //        }        //    }        //}        //     void T2()        //{        //    //工作线程占有了workerRes,并试图访问mainRes;        //    lock (workerRes)        //    {        //        Thread.Sleep(10);        //        lock (mainRes)        //        {        //            Console.WriteLine(mainRes.Data);        //        }        //    }        //}                #endregion

检测死锁

   为了检测死锁,我们改进如上代码:

namespace 死锁{    //资源    public class Resource {        public string Data;        }    class Program    {        private Resource mainRes = new Resource() { Data = "mainRes" };        private Resource workerRes = new Resource() { Data = "workerRes" };        static void Main(string[] args)        {            Thread.CurrentThread.Name = "main ";            Program p = new Program();            Thread worker = new Thread(p.T2);            worker.Name = "worker";            worker.Start();            T1(p);        }        #region 使用Monitor.TryEnter方法——对可能产生死锁的位置进行检测             static void T1(Program p) {            lock (p.mainRes )            {                Thread.Sleep(10);                int i = 0;                while (i<3)                {                    if (Monitor.TryEnter (p.workerRes ))                    {                        Console.WriteLine(p.workerRes .Data);                        Monitor.Exit(p.workerRes );                        break;                    }                    else                    {                        Thread.Sleep(1000);//1秒后重试                    }                    i++;                }                if (i==3)                {                    Console.WriteLine("{0}:tried 3 times,deadlock",Thread.CurrentThread .Name);                 }            }                        }             void T2() {                 lock (workerRes)                 {                     Thread.Sleep(10);                     int i = 0;                     while (i < 3)                     {                         if (Monitor.TryEnter(mainRes ))                         {                             Console.WriteLine(mainRes .Data );                             Monitor.Exit(mainRes);                             break;                         }                         else                         {                             Thread.Sleep(1000);//1秒后重试                         }                         i++;                     }                     if (i == 3)                     {                         Console.WriteLine("{0}:tried 3 times,deadlock", Thread.CurrentThread.Name);                     }                 }                          }        #endregion    }}

    如上代码,我们可以使用Monitor.TryEnter方法来对程序中可能产生死锁的位置进行检测。

转载地址:http://mzmxl.baihongyu.com/

你可能感兴趣的文章
28.umask值
查看>>
制作Sysprep 静默安装脚本指南
查看>>
pandas
查看>>
文件操作工具类
查看>>
03,什么是shell,一些最基本的命令和小技巧。
查看>>
nginx教程从入门到精通(ttlsa出品)
查看>>
squid日志之access.log格式+内容
查看>>
mac 下常见问题处理
查看>>
Shell自动修改CentOS6网卡配置文件
查看>>
Java记录 -12- 方法重载与重写
查看>>
[SSH]如何发送 ctrl+c,或者ESC
查看>>
安装Fedora 17/18 后需要做的几件事(不断更新)
查看>>
Get与Post的区别
查看>>
Java 对象的深复制五种方式
查看>>
未整理 笔面试题
查看>>
Ueditor相关问题
查看>>
thinkphp的模板中引用session中的数据
查看>>
Spring的两种常见的注入
查看>>
使用命令设置ubuntu8.10的ip及DNS
查看>>
[转]DPM2012系列之十一:还原exchange 2010数据库
查看>>