导航
当前位置: 首页 > 编程有哪些语言 >

如何避免多线程死锁?多线程死锁的原因和幸免策略(多线程如何防止并发)

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、编写程序验证死锁,从源头上避免死锁。

以上就是多线程死锁的原因及避免策略。当一组进程中的每个进程都占用了不会被释放的资源,但是它们申请了其他进程正在使用的资源并且不会被释放时,就会发生死锁。一种永久等待状态,在编程过程中按照线程逻辑进行操作,将有效避免多线程死锁的发生。

家庭软件教程

金山WPS文字排版通用必备技巧指南分享

WPS没有标尺怎么找

wps怎么设置将文字隐藏

wps制作爱心标志的操作方法

wps表格如何新建表格样式

WPS演示中丰富多彩的移动效果

在wps中如何删除表格单元格

在WPS文字中插入智能图形后如何调整大小

wps表格怎样设置自动换行

WPS演示2013实现放映幻灯片中指定的几页无需删除多余的

相关资讯
广告 广告 广告