码迷,mamicode.com
首页 > 其他好文 > 详细

死锁的产生与检测

时间:2015-01-20 20:30:48      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:多线程   线程   操作系统   


产生死锁



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



   #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://blog.csdn.net/lhc1105/article/details/42922713

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!