多线程编程:线程死锁的原因以及解决方法
来源:互联网 发布:58网络电视直播 编辑:程序博客网 时间:2024/05/29 15:04
多线程编程:线程死锁的原因以及解决方法
关于线程死锁这个问题相信程序员在编写多线程程序时会经常遇到的一个经典问题,这种情况往往出现在多个线程同时对临界资源访问时所产生的。
属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。诸进程间应采取互斥方式,实现对这种资源的共享。
当我们在使用两个不同的线程访问同一个临界资源时就会出现如下情况:
线程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则阻塞等待着线程解锁不会做过多的额外工作!
当对硬件资源访问时也是如此,一个硬件资源同时只能被一个进程/线程所使用。
阅读全文
0 0
- 多线程编程:线程死锁的原因以及解决方法
- 死锁产生的原因以及解决方法
- 多线程死锁以及解决方法
- 多线程编程---线程死锁
- 【线程死锁】Android多线程死锁的产生以及如何避免
- Java多线程产生死锁的原因和解决方法
- 线程同步之死锁的原因和解决方法
- Oracle常见死锁发生的原因以及解决方法
- Oracle常见死锁发生的原因以及解决方法
- Java多线程产生死锁的条件以及解决方法
- Java中的多线程,线程锁,以及死锁
- 多线程中的线程通信以及死锁问题
- 多线程编程之线程死锁问题
- 进程死锁的危害、导致原因、解决方法
- 进程死锁的危害、导致原因、解决方法
- 死锁产生的原因和解决方法
- 多线程死锁的产生原因及避免
- 多线程专题之线程死锁原因之谜
- spring06 aop 引入
- 8皇后问题
- 机器学习(1) ---- 机器学习算法综述
- vmware克隆centOS虚拟机
- [4]_[解决]Ubuntu16.04.3 DNS解析失败
- 多线程编程:线程死锁的原因以及解决方法
- Spark编程指南入门之Java篇一-基本知识
- 求出0~999之间的所有“水仙花数”并输出。
- web.xml中url-pattern的/和/*的区别
- .创建一个窗口程序(JFrame),标题栏起名为“浏览器”,有一个菜单条,有“文件”、“编辑”、“查看”3个菜单。“文件”菜单有两个菜单项,一项是“打开”,一项是“保存”,“打开”项做成子菜单,有两个
- 单例模式之懒汉式
- ubuntu jupyter notebook配置
- 计蒜客bfs 蒜头君回家(增维打标记)
- 编写程序数一下 1到 100 的所有整数中出现多少次数字9