死锁的产生与检测

产生死锁

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

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

时间: 2024-11-09 06:37:49

死锁的产生与检测的相关文章

Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript.

Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript. 1. 现象::主程序卡住无反应,多行任务不往下执行 1 2. 原因::使用jv jprofile查看线程,原来俩个线程死锁了.. 1 3. Java的缺点,默认不能自动解除死锁 1 4. 自动检测与解除死锁::使用看门狗watchdog 2 4.1. 死锁检测算法(太麻烦,不推荐) 2 4.2. 硬件看门狗 2 4.3. 软件看门狗的实现--TIMER 2 4.4. LIN

Linux死锁检测-Lockdep

专题:Linux内存管理专题 关键词:LockDep.spinlock.mutex. lockdep是内核提供协助发现死锁问题的功能. 本文首先介绍何为lockdep,然后如何在内核使能lockdep,并简单分析内核lockdep相关代码. 最后构造不同死锁用例,并分析如何根据lockdep输出发现问题根源. 1. Lockdep介绍 死锁是指两个或多个进程因争夺资源而造成的互相等待的现象. 常见的死锁有如下两种: 递归死锁:中断等延迟操作中使用了锁,和外面的锁构成了递归死锁. AB-BA死锁:

线程的同步与互斥,死锁

线程的同步与互斥 多个线程同时访问共享数据时可能会发生冲突,比如两个线程同时把一个全局变量加1,结果可能不是我们所期待的: 我们看这段代码的执行结果: #include <stdio.h> #include <stdlib.h> #include <pthread.h> static int g_count=0; void *thread(void *arg) { int index=0; int tmp=0; while(index++<5000) { tmp=

java如何避免死锁

在有些情况下死锁是可以避免的.本文将展示三种用于避免死锁的技术: 加锁顺序 加锁时限 死锁检测 加锁顺序 当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生. 如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生.看下面这个例子: Thread 1: lock A lock B Thread 2: wait for A lock C (when A locked) Thread 3: wait for A wait for B wait for C 如果一个线程(比

避免死锁

在有些情况下死锁是可以避免的.本文将展示三种用于避免死锁的技术: 加锁顺序 加锁时限 死锁检测 加锁顺序 当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生. 如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生.看下面这个例子: Thread 1: lock A lock B Thread 2: wait for A lock C (when A locked) Thread 3: wait for A wait for B wait for C 如果一个线程(比

java学习避免死锁

原文链接        作者:Jakob Jenkov 译者:申章   校对:丁一 在java中有些情况下死锁是可以避免的.本文将展示三种用于避免死锁的技术: 加锁顺序 当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生. 如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生.看下面这个例子: Thread 1:  lock A   lock BThread 2:   wait for A   lock C (when A locked)Thread 3:   wa

MySQL死锁[转]

案例描述       在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志. 两个sql语句如下:       (1)insert into backup_table select * from source_table      (2)DELETE FROM source_table WHERE Id>5 AND titleWeight<32768 AND joinTime<'$daysago_1week'   

操作系统--并发进程死锁

死锁概念: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程. 死锁产生的条件: (最关键的为第四个条件)             解决死锁的方法:   预防死锁:指进程申请资源必须遵循某些预先制定的限制条件,以破坏产生死锁的四个必要条件中的一个或者几个,防止死锁的发生. 避免死锁:指当进程申请资源时,需要首先判断(预测),如果满足这次资源请求

【操作系统】处理机调度与死锁(三)

一.前言 前面介绍了进程与线程的相关概念,现在继续学习处理机调度,处理机是系统最重要的资源,提高处理机的利用率和改善系统性能,在很大程度上取决于处理机调度性能的好坏,下面来介绍处理的调度以及死锁的问题. 二.处理机调度的层次 2.1 高级调度 高级调度又称为作业调度或长程调度,主要功能是根据某种算法,把外存上处于后备队列中的那些作业调入内存,调度的对象是作业. 作业,包含了程序.数据.作业说明书,系统根据该作业说明书来控制程序的运行.在批处理系统中,是以作业为基本单位从外存调入内存的. 作业步,