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

I. 死锁的原因和条件:
僵局的原因:
1. 系统资源不足;
2,进程(线程)的进度顺序不合适;
3. 资源分配不当.
根据编程经验,死锁的一般原因如下:

1. 使用锁的个人体验有所不同.
2. 程序模块之间使用锁的区别.
3. 工程代码版本之间的差异.
4. 项目代码分支之间的差异.
5. 代码修改和重构导致的差异.
死锁形成条件:
1. 互斥条件: 所谓互斥是指在一定时间内对进程进行互斥的资源.
2. 请求和保留条件: 当进程由于请求资源而被阻塞时,它将继续保留所获取的资源.

3. 不剥夺条件: 该过程已获得资源,在使用结束之前不能强行剥夺它.
4. 循环等待条件: 多个进程之间形成一种循环等待资源关系.
第二种常见死锁情况
死锁的常见情况如下:
1. 忘记释放锁:
01void data_process()02 {03EnterCriticalSection(); 04如果(/ *错误发生线程死锁,忘记LeaveCriticalSection * /)05返回; 06LeaveCriticalSection(); 07}复制代码
void data_process(){EnterCriticalSection();如果(/ *错误发生,忘记LeaveCriticalSection * /)返回; LeaveCriticalSection();}
2,单线程重复锁定应用程序:

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 * /

三种避免死锁的策略
死锁的代价非常大,有时很难检测和排除故障,因此您需要在编程过程中尽可能避免死锁. 为了避免编程中的死锁,应遵循以下策略:
1. 在编写多线程程序之前,请先编写正确的程序,然后将其移植到多线程.
2. 始终检查跳出时写的程序是否忘记了释放锁.
3. 如果您的模块可以重用锁,则建议使用嵌套锁.
4. 对于某些锁定代码,请勿临时重写. 建议使用库中的锁或您自己编写的锁.
5. 如果企业需要获取多个锁,则必须确保按一定顺序获取锁,否则将不可避免地死掉.
6. 编写简单的测试用例以验证没有死锁.
7. 编写一个验证死锁并避免源代码死锁的程序.
以上是多线程死锁的原因和生存策略. 一组死锁中的每个进程都保存有不会释放的资源,但是由于相互应用线程死锁,其他进程不会释放这些资源,并且在永久等待状态下,在编程过程中,基于线程逻辑的操作可以有效地防止多线程死锁的发生.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-146226-1.html
盯住日本动态
芝麻糊里面都是密封包装