b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

如何避免多线程死锁?多线程死锁的原因和生存策略

电脑杂谈  发布时间:2020-03-20 17:12:29  来源:网络整理

c++ 线程死锁_c 线程死锁_线程死锁

多线程编程过程中,我们不仅要解决数据访问的同步和互斥,还要注意多线程死锁的问题. 多线程死锁的原因可归因于系统资源不足和进程前进. 诸如订购不当或资源分配不当之类的问题. 有什么方法可以避免形成多线程死锁?请参见下面.

如何避免多线程死锁?多线程死锁的原因和幸免策略

I. 死锁的原因和条件:

僵局的原因:

1. 系统资源不足;

2,进程(线程)的进度顺序不合适;

3. 资源分配不当.

根据编程经验,死锁的一般原因如下:

c 线程死锁_线程死锁_c++ 线程死锁

1. 使用锁的个人体验有所不同.

2. 程序模块之间使用锁的区别.

3. 工程代码版本之间的差异.

4. 项目代码分支之间的差异.

5. 代码修改和重构导致的差异.

死锁形成条件:

1. 互斥条件: 所谓互斥是指在一定时间内对进程进行互斥的资源.

2. 请求和保留条件: 当进程由于请求资源而被阻塞时,它将继续保留所获取的资源.

c 线程死锁_c++ 线程死锁_线程死锁

3. 不剥夺条件: 该过程已获得资源,在使用结束之前不能强行剥夺它.

4. 循环等待条件: 多个进程之间形成一种循环等待资源关系.

第二种常见死锁情况

死锁的常见情况如下:

1. 忘记释放锁:

01void data_process()02 {03EnterCriticalSection(); 04如果(/ *错误发生线程死锁,忘记LeaveCriticalSection * /)05返回; 06LeaveCriticalSection(); 07}复制代码

void data_process(){EnterCriticalSection();如果(/ *错误发生,忘记LeaveCriticalSection * /)返回; LeaveCriticalSection();}

2,单线程重复锁定应用程序:

c++ 线程死锁_线程死锁_c 线程死锁

01void sub_func()02 {03EnterCriticalSection(); 04do_something(); 05LeaveCriticalSection(); 06)07void data_process()08 {09EnterCriticalSection(); 10sub_func(); 11LeaveCriticalSection(); 12}复制代码

void sub_func(){EnterCriticalSection();做点什么 (); LeaveCriticalSection();} void data_process(){EnterCriticalSection(); sub_func(); LeaveCriticalSection();}

3. 多线程和多锁应用程序:

01void data_process1()02 {03EnterCriticalSection(&cs1); //申请锁的顺序取决于04EnterCriticalSection(&cs2); 05do_something1(); 06LeaveCriticalSection(&cs2); 07LeaveCriticalSection(&cs1); 08} 09void data_EnterCection(11){(&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 * /

c++ 线程死锁_线程死锁_c 线程死锁

三种避免死锁的策略

死锁的代价非常大,有时很难检测和排除故障,因此您需要在编程过程中尽可能避免死锁. 为了避免编程中的死锁,应遵循以下策略:

1. 在编写多线程程序之前,请先编写正确的程序,然后将其移植到多线程.

2. 始终检查跳出时写的程序是否忘记了释放锁.

3. 如果您的模块可以重用锁,则建议使用嵌套锁.

4. 对于某些锁定代码,请勿临时重写. 建议使用库中的锁或您自己编写的锁.

5. 如果企业需要获取多个锁,则必须确保按一定顺序获取锁,否则将不可避免地死掉.

6. 编写简单的测试用例以验证没有死锁.

7. 编写一个验证死锁并避免源代码死锁的程序.

以上是多线程死锁的原因和生存策略. 一组死锁中的每个进程都保存有不会释放的资源,但是由于相互应用线程死锁,其他进程不会释放这些资源,并且在永久等待状态下,在编程过程中,基于线程逻辑的操作可以有效地防止多线程死锁的发生.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-146226-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...