死锁的产生与检测

简介: 产生死锁     在操作系统中,我们可能接触过两个进程争抢资源,互不相让,然后产生了死锁,这时候,我们可以用银行家算法来分配资源。下面,我们先模拟产生死锁: #region 试图产生死锁的代码 // static void T1(Prog...


产生死锁



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



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






目录
相关文章
|
6月前
|
安全 开发工具
防止死锁的关键策略
防止死锁的关键策略包括:避免持有多个锁,按相同顺序获取,设置锁获取超时,减小锁粒度,以及利用死锁检测工具。确保线程安全,减少锁竞争,可提高系统并发性能。
70 1
|
22天前
|
存储 SQL 监控
|
3月前
|
监控 算法 安全
Java并发编程案例分析:死锁的检测与解决
Java并发编程案例分析:死锁的检测与解决
38 2
|
3月前
|
资源调度 算法
深入理解网络中的死锁和活锁现象
【8月更文挑战第24天】
134 0
|
6月前
|
监控 算法 安全
Java并发编程案例分析:死锁的检测与解决
【4月更文挑战第6天】Java并发编程中的死锁导致线程僵持,资源无法释放,影响程序性能。死锁涉及互斥、请求与保持、不剥夺和循环等待四个条件。案例分析展示了银行转账场景下的死锁可能。检测死锁可通过日志、代码审查和使用工具。解决策略包括避免死锁(如设定锁顺序、超时机制)和处理死锁(如终止线程、资源抢占)。理解死锁原理并采取预防措施对构建稳定、高效的多线程应用至关重要。
130 1
什么是死锁?产生死锁的原因?产生死锁的四个必要条件?死锁的避免与预防?
什么是死锁?产生死锁的原因?产生死锁的四个必要条件?死锁的避免与预防?
276 0
|
6月前
|
算法
死锁的一点分析
死锁的一点分析
|
6月前
|
算法 安全
解决死锁的方法
解决死锁的方法
|
调度
死锁的四个必要条件及避免策略
死锁的四个必要条件及避免策略
340 0
死锁的四个必要条件及避免策略
|
算法 安全 程序员
2.5操作系统(预防死锁 避免死锁 检测和解除死锁)
1.死锁 1.什么是死锁? 2.死锁、饥饿、死循环的区别 3.死锁产生的必要条件 4.什么时候会发生死锁 5.死锁的处理策略 2.死锁的处理策略——预防死锁 1.破坏互斥条件 2.破坏不剥夺条件 3.破坏请求和保持条件 4.破坏循环等待条件 3.死锁的处理策略——避免死锁 1.什么是安全序列 2.安全序列、不安全状态、死锁的联系 3.银行家算法 1. 实现步骤 2. 银行家算法示例(手算) 3. 代码实现 4.死锁的处理策略——检测和解除 1.死锁的检测 2. 死锁的解除
2.5操作系统(预防死锁 避免死锁 检测和解除死锁)