死锁的产生与检测


产生死锁



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



   #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方法来对程序中可能产生死锁的位置进行检测。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值