iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#多线程死锁介绍与案例代码
  • 147
分享到

C#多线程死锁介绍与案例代码

2024-04-02 19:04:59 147人浏览 独家记忆
摘要

一、死锁简介 在多道程序设计环境下,多个进程可能竞争一定数量的资源,。一个进程申请资源,如果资源不可用,那么进程进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待的进程有可

一、死简介

在多道程序设计环境下,多个进程可能竞争一定数量的资源,。一个进程申请资源,如果资源不可用,那么进程进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待的进程有可能无法改变状态,这种情况下称之为死锁。

二、死锁条件

死锁的四个条件:

1.非抢占:资源不能被抢占
2.互斥:至少有一个资源必须处在非共享模式,即一次只能有一个进程使用,如果另一进程申请该资源,那么申请进程必须延迟直到该资源释放为止。
3.占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。
4.循环等待:有一组进程{P0,P1,…Pn},P0等待的资源被P1占有,P1等待的资源被P2占有,Pn-1等待的资源被Pn占有,Pn等待的资源被P0占有。

形成死锁必须要满足这四个条件。那么违背这几个条件中的任何一个就不会形成死锁,这种方式成为 死锁预防,而死锁避免是动态的检测分配资源的状态是否安全

三、解决办法

1.我们可以通过对锁加时效性,或者死锁检测来处理。

2.Monitor.TryEnter()方法。虽然这种方法可以解决死锁问题,但是最好还是不要出现死锁这种情况。

死锁案例代码

如下代码实现创建两个线程t1和t2,分别起初分配占用lock1和ock2资源。当一个线程t1占用资源lock1时,再去请求另外一个资源lock2时,此时由于另外一个线程t2在正占用资源t2,请求失败,等待释放资源。同时t2又发出请求资源lock1,但是lock1又被t1占用,没有释放,也只能进行等待。此时两个线程只能等待一直等待对方释放资源,这就称之为死锁。

namespace Deadlock
{
    class DL
    {
        int field1 = 0;
        int field2 = 0;
        private object lock1 = new int[1];
        private object lock2 = new int[1];

        public void First(int val)
        {
            lock (lock1)
            {
                Console.WriteLine("First: Acquired lock 1: "
                    + Thread.CurrentThread.GetHashCode() + " Now Sleeping.");
                
                //Try commenting Thread.Sleep()
                Thread.Sleep(1000);//此时t2线程占用资源

                Console.WriteLine("First: Acquired lock 1: "
                    + Thread.CurrentThread.GetHashCode() + " Now wants lock2.");

                //当请求锁lock2时,lock被t2线程占用,等待释放
                lock (lock2)
                {
                    Console.WriteLine("First: Acquired lock 2: "
                        + Thread.CurrentThread.GetHashCode());
                    field1 = val;
                    field2 = val;
                }
            }
        }

        public void Second(int val)
        {
            lock (lock2)
            {
                Console.WriteLine("Second: Acquired lock 2: "
                    + Thread.CurrentThread.GetHashCode());
                //当请求锁lock1时,lock1被t1线程占用,等待释放
                lock (lock1)
                {
                    Console.WriteLine("Second: Acquired lock 1: "
                        + Thread.CurrentThread.GetHashCode());
                    field1 = val;
                    field2 = val;
                }
            }
        }
    }

    public class MainApp
    {
        DL d = new DL();

        public static void Main()
        {
            MainApp m = new MainApp();
            Thread t1 = new Thread(new ThreadStart(m.Run1));
            t1.Start();
            Thread t2 = new Thread(new ThreadStart(m.Run2));
            t2.Start();
            Console.ReadLine();
        }

        public void Run1()
        {
            this.d.First(10);
        }

        public void Run2()
        {
            this.d.Second(10);
        }
    }
}

到此这篇关于C#多线程之死锁的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#多线程死锁介绍与案例代码

本文链接: https://www.lsjlt.com/news/146359.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#多线程死锁介绍与案例代码
    一、死锁简介 在多道程序设计环境下,多个进程可能竞争一定数量的资源,。一个进程申请资源,如果资源不可用,那么进程进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待的进程有可...
    99+
    2022-11-13
  • C#多线程死锁实例代码分析
    这篇文章主要介绍“C#多线程死锁实例代码分析”,在日常操作中,相信很多人在C#多线程死锁实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#多线程死锁实例代码分析”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
  • C++多线程之互斥锁与死锁
    目录1.前言2.互斥锁2.1 互斥锁的特点2.2 互斥锁的使用2.3 std::lock_guard3.死锁3.1 死锁的含义3.2 死锁的例子3.3 死锁的解决方法1.前言 比如说...
    99+
    2022-11-12
  • java线程死锁代码示例
    死锁是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法时提出的,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一。事实上,计算机世界有很多事情需要多线程方式去解决,因为这样才能...
    99+
    2023-05-30
    java 线程 死锁
  • java多线程死锁问题的详细介绍
    本篇内容主要讲解“java多线程死锁问题的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java多线程死锁问题的详细介绍”吧!一、什么是死锁当两个或两个...
    99+
    2022-10-19
  • C#单例模式与多线程用法介绍
    一、单例模式 我们先来看看两种创建单例模式的示例代码。 1、饿汉式  饿汉式创建单例模式是在程序里面直接初始化了一个对象实例: class Good { /// &...
    99+
    2022-11-13
  • shell 多线程介绍与举例
    在Shell脚本中实现多线程通常可以使用以下几种方式: 后台执行:在Shell脚本中,你可以使用&符号将某个命令放在后台执行,这样可以同时执行多个命令,达到多线程的效果。例如: #!/bin/bashcommand1 &command2 &...
    99+
    2023-08-21
    linux bash 服务器
  • Java多线程的内置锁与显示锁介绍
    这篇文章主要讲解了“Java多线程的内置锁与显示锁介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程的内置锁与显示锁介绍”吧!Synchronized内置锁获得锁和释放锁是隐式...
    99+
    2023-06-17
  • Java编程之多线程死锁与线程间通信简单实现代码
    死锁定义 死锁是指两个或者多个线程被永久阻塞的一种局面,产生的前提是要有两个或两个以上的线程,并且来操作两个或者多个以上的共同资源;我的理解是用两个线程来举例,现有线程A和B同时操作两个共同资源a和b,A操作a的时候上锁LockA,继续执行...
    99+
    2023-05-30
    java 多线程 ava
  • python多线程中互斥锁与死锁的示例分析
    小编给大家分享一下python多线程中互斥锁与死锁的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、多线程间的资源竞争以下列task1(),task2()两个函数为例,分别将对全局变量num加一重复一千万次循环(...
    99+
    2023-06-29
  • C语言多线程开发中死锁与读写锁问题详解
    目录死锁读写锁死锁 有时,一个线程需要同时访问两个或更多不同的共享资源,而每个资源又都由不同的互斥量管理。当超过一个线程加锁同一组互斥量时,就有可能发生死锁; 两个或两个以上的进程在...
    99+
    2022-11-13
  • C语言多线程开发中死锁与读写锁问题怎么解决
    今天小编给大家分享一下C语言多线程开发中死锁与读写锁问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。死锁有时,一个...
    99+
    2023-06-30
  • 如何进行Java多线程循环相关的代码介绍
    这篇文章给大家介绍如何进行Java多线程循环相关的代码介绍,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java多线程循环需要我们不断的学习,有很多的问题一直是我们相互关心的。下面我们就来看看如何才能更好的使用这门编程...
    99+
    2023-06-17
  • PythonPyqt5多线程更新UI代码实例(防止界面卡死)
    """ 在编写GUI界面中,通常用会有一些按钮,点击后触发事件, 比如去下载一个文件或者做一些操作, 这些操作会耗时,如果不能及时结束,主线程将会阻塞, 这样界面就会出现未响应的状态...
    99+
    2022-11-12
  • Java LongAdder类介绍、代码示例、底层实现原理及与分段锁的区别
    LongAdder介绍 LongAdder是Java并发包(java.util.concurrent)中的一个类,用于高效地实现多线程环境下的加法操作。 在多线程环境中,如果多个线程同时对同一个变量进...
    99+
    2023-09-06
    java jvm 开发语言
  • Java多线程之等待唤醒机制及案例代码演示
    生产者和消费者(等待唤醒机制) 等待唤醒机制常见方法代码演示等待唤醒机制(阻塞队列方式实现)额外扩展 等待唤醒机制 生产者和消费者是一个十分经典的多线程协作模式 举个小栗子来说明一下消费者...
    99+
    2023-10-25
    java 多线程 等待唤醒机制 thread Runnable notify wait
  • java利用Future实现多线程执行与结果聚合实例代码
    目录场景解决总结场景 网站智能问答场景,需要对多个分类查询,结果聚合展示 由于每种分类都有自己的业务逻辑,有的需要查询数据库中间库,有的需要查询elasticsearch搜索引擎,有...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作