多线程编程:线程死锁的原因以及解决方法

关于线程死锁这个问题相信程序员在编写多线程程序时会经常遇到的一个经典问题,这种情况往往出现在多个线程同时对临界资源访问时所产生的。

属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。诸进程间应采取互斥方式,实现对这种资源的共享。

当我们在使用两个不同的线程访问同一个临界资源时就会出现如下情况:

线程A优先被创建出来并优先去获得对临界资源的操作权限,线程A里有一个循环代码会循环对该临界资源进行操作,因此就会操作系统内核在进程里的线程之间调度时会出现这样一种情况:线程A在对该临界资源操作时,线程B呼唤操作系统取的CPU控制权时,会有一个线程调用之间的现场保护,会对线程里的代码执行到了哪一步或者循环次数的记录保存到寄存器里,下次获取CPU控制权时会读取该记录,此时如果线程A没有结束的情况下会一直占用着该临界资源,导致线程B无法对该临界资源做写操作,从而进入无限的阻塞等待,从而导致了死锁的情况!

解决办法“加锁”:

void data_process1()
{
    EnterCriticalSection(&ss1);  // 申请锁的顺序有依赖
    EnterCriticalSection(&ss2);
    do_something1();
    LeaveCriticalSection(&ss2);
    LeaveCriticalSection(&ss1);
}
void data_process2()
{
    EnterCriticalSection(&ss2);  // 申请锁的顺序有依赖
    EnterCriticalSection(&ss1);
    do_something2();
    LeaveCriticalSection(&ss1);
    LeaveCriticalSection(&ss2);
}

当我们线程A加锁时线程B不会工作阻塞等待着线程A释放锁,这样就可以有效的防止线程B进入死锁,注意死锁的时候线程B会不断的对该临界资源写数据但是每次都会失败,而加锁的话线程B则阻塞等待着线程解锁不会做过多的额外工作!

当对硬件资源访问时也是如此,一个硬件资源同时只能被一个进程/线程所使用。

多线程编程:线程死锁的原因以及解决方法相关推荐

  1. mysql死锁的原因及解决方法_mysql死锁的原因及解决方法

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. mysql死锁的原因及解决方法如下: 1.一个用户A访问表A(锁住了表A),然后又访问表B:另一个用户B 访问表B(锁住了表B), ...

  2. 数据库--死锁产生原因及解决方法

    数据库与操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据时,就会产生多个事务同时存取统一数据的情况.如果对并发操作没有相应的控制就可能会导致读取和存储不正确的数据,破坏了数据库的一致 ...

  3. MySQL--死锁的原因及解决方法

    原文网址:MySQL--死锁的原因及解决方法_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍MySQL死锁的原因及解决方法. InnoDB中,除单个SQL组成的事务外,锁是逐步获得的,所以可能 ...

  4. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  5. mysql 死锁原因_Mysql并发时经典常见的死锁原因及解决方法

    1.mysql都有什么锁 MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒 ...

  6. 多线程编程—线程池的实现

    多线程编程-线程池的实现 执行与任务分离的组件- 线程池 https://github.com/wangbojing/threadpool 多线程技术主要解决了处理器单元内多个线程执行的问题,它可以显 ...

  7. 进程死锁原因及解决方法

    进程死锁原因及解决方法 死锁的概念 死锁处理方法 死锁预防(静态策略) 死锁避免(动态策略) 银行家算法⭐ 死锁检测和解除 资源分配图 死锁解除 死锁的概念 死锁:指多个进程因竞争资源而造成的一种僵局 ...

  8. Java中死锁产生的原因及解决方法

    一.什么是死锁 死锁就是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的现象,若无外力作用,他们都无法推进下去. 简单来说就是A和B若同时都有一个资源,在此之外还想拥有对方的资 ...

  9. 死锁产生的原因以及解决方法

    死锁产生的原因以及解决方法 参考文章: (1)死锁产生的原因以及解决方法 (2)https://www.cnblogs.com/JimmyFanHome/p/9914562.html 备忘一下.

最新文章

  1. 线段树 ---- 牛客多校4 ETree Xor 区间异或分段
  2. labview虚拟心电监测系统_机器视觉系统单相机模型
  3. 软件视频会议Vidyo体验
  4. android 9.0 https 适配,android9.0适配HTTPS:not permitted by network security policy'
  5. Windows2012R2 Hyper-v3.0 高可用群集安装及配置(Live Migration)
  6. 2017.11.23知识点整理
  7. 冒烟的意思_冒烟测试是什么?
  8. EJB MEMCACHED 缓存技术
  9. 代码调试之-单步调试问题
  10. html特殊符号拉丁文,拉丁文字符号大全,罗马字母
  11. 微信小程序图片等比缩放显示正中间
  12. B BL BLX BX详解
  13. android+如何设置单屏壁纸,给你一个设置单屏壁纸的软件
  14. BZOJ3745: [Coci2015]Norma【CDQ】
  15. 二叉树、二叉查找树与红黑树的原理及Java实现
  16. 接口压测实践-压力测试常见参数解释说明
  17. QT4.8.6调用zlib库实现数据流的压缩与解压缩
  18. Java分布式全局ID(一)
  19. ruoyi 页面跳转_若依及vue-element-admin vue 管理系统第三方拼多多登录
  20. Ventoy-一种更便捷的OS启动盘制作方法

热门文章

  1. python中的常量_深入理解Python中的内置常量
  2. mybatis mysql 中文乱码_mybatis连接mysql数据库插入中文乱码
  3. 神通数据库打开服务_数据库周刊30丨数据安全法草案将亮相;2020数据库产业报告;云南电网上线达梦;达梦7误删Redo…...
  4. 虚拟主机金华php空间,金华虚拟主机_金华云虚机_金华主机申请_金华网站空间_爱名网(www.22.cn)...
  5. c语言.h和.c连接错误,conio.h链接错误问题
  6. linux中使用u盘和光驱的命令_linux命令详解之挂载光驱的方法
  7. 怎么看so文件是哪个aar引进来的_突破微信限制,超大文件可以随便发
  8. localhost可以访问 ip不能访问_如何解决域名可以访问80端口但访问不了其他端口的问题...
  9. 符号常量和变量有什么区别_JVM是什么?
  10. linux 网络监控 邮件,一种基于Linux的邮件监控方法与流程