2022-01-18 作者 :IT编程网 围观 : 590次
2022-12-14 首页软件教程在多线程编程过程中,不仅要解决数据访问的同步和互斥,还要注意多线程死锁问题,以及多线程死锁的原因可能是系统资源不足、进程推进顺序不正确或者资源分配不当等问题。有没有办法避免多线程死锁的形成?见下文。
1、死锁原因及条件:
死锁产生的原因:
1、系统资源不足;
2、进程(线程)的推进顺序不合适;
3.资源配置不当。
从编程经验来看,产生死锁的一般原因有以下几种:
1、个人使用锁体验的差异。
2、程序模块对锁的使用上的差异。
3、工程代码版本差异。
4.工程代码分支之间的差异。
5、修改代码和重构代码带来的差异。
死锁形成的条件:
1、互斥条件:所谓互斥是指一个进程在一定时间内独占资源。
2.请求和保持条件:当一个进程因请求资源而被阻塞时,它将保持所获得的资源。
3、非剥夺条件:进程已获得资源,在资源用完之前不能强行剥夺。
4、循环等待情况:多个进程形成头尾循环等待资源关系。
2. 常见死锁场景
发生死锁的常见情况包括以下几种:
1.忘记释放锁:
01void data_process()02{03EnterCriticalSection();04if(/*发生错误,忘记LeaveCriticalSection */)05return;06LeaveCriticalSection();07}复制代码void data_process(){EnterCriticalSection();if(/*发生错误,忘记LeaveCriticalSection * /)return;LeaveCriticalSection();} 2、单线程重复申请锁:
01void sub_func()02{03EnterCriticalSection();04do_something();05LeaveCriticalSection();06}07void data_process()08{09EnterCriticalSection();10sub_func();11LeaveCriticalSection();12}复制代码void sub_func(){EnterCriticalSection() ; do_something();LeaveCriticalSection();}void data_process(){EnterCriticalSection();sub_func();LeaveCriticalSection();}3.多线程多锁应用:
01void data_process1 () 02 {03NATCRITICALSECTION (CS1); //应用锁的顺序取决于04EntercripicalSection (CS2); 05Do_SOMETHING1(); 06LeAveCritalSecti ON (CS2); 07离开关键部分(CS1); 08} 09Void Data_Process2 () 10 {11NTERCRITICALTION (CS2) ;//申请锁的顺序取决于12EnterCriticalSection(cs1);13do_something2();14LeaveCriticalSection(cs1);15LeaveCriticalSection(cs2);16}复制代码void data_process1() {EnterCriticalSection(cs1);//申请锁的顺序取决于EnterCriticalSection(cs2);do_something1();LeaveCriticalSection(cs2);LeaveCriticalSection(cs1);}void data_process2(){EnterCriticalSection(cs2);//顺序申请锁取决于EnterCriticalSection(cs1);do_something2();LeaveCriticalSection(cs1 );LeaveCriticalSection(cs2);}4.环锁应用:
01/* 多个线程申请锁的顺序形成相互依赖的环: 02* A-B03* ||04* C-D05*/复制代码/* 多个线程申请锁的顺序形成相互依赖的环: * A -B* ||* C D*/3。避免死锁的策略
死锁的成本非常高,有时很难检测和排除故障。因此,在编程过程中需要尽可能避免死锁。为了避免编程中出现死锁,应该遵循以下策略:
1.在编写多线程程序之前,首先编写正确的程序,然后将其移植到多线程。
2、经常检查自己写的程序退出时是否忘记释放锁。
3. 如果你的模块可能会重复使用锁,建议使用嵌套锁。
4. 对于某些锁码,暂时不要重写。建议使用库里的锁或者自己写的锁。
5、如果某个业务需要获取多个锁,必须保证按照一定的顺序获取锁,否则会出现死锁。
6. 编写简单的测试用例来验证是否存在死锁。
7、编写程序验证死锁,从源头上避免死锁。
以上就是多线程死锁的原因及避免策略。当一组进程中的每个进程都占用了不会被释放的资源,但是它们申请了其他进程正在使用的资源并且不会被释放时,就会发生死锁。一种永久等待状态,在编程过程中按照线程逻辑进行操作,将有效避免多线程死锁的发生。
家庭软件教程
解决IE6,IE7不能隐藏(overflow:hidden)绝对定位溢出的内容2022-12-23首页软件教程烦人的IE…
网易新闻APP怎么重新设置头像?重新设置头像的方法说明2023-01-05首页软件教程如何重置网易新闻APP头像。很多用…
CSS对浏览器的兼容性性处理(IE7,6与Fireofx)2022-12-23首页软件教程从网上收集了IE7、6、Fir…
solidworks2019动画制作怎么操作?solidworks2019动画制作操作步骤分享2022-12-31首页软…
兼容IE6的min-width、min-height的简单方法2022-12-23主页软件教程如果网站是宽屏的,左右拖动…