欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

死锁的产生与检测

程序员文章站 2022-04-17 14:36:43
...


产生死锁



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



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