多线程之避免死锁
来源:百度文库 编辑:神马文学网 时间:2024/09/21 08:19:36
概念:死锁是指永久阻塞一组争用一组资源的线程。
导致死锁的最常见情况是自死锁或递归死锁。在自死锁或递归死锁中,线程尝试获取已被其持有的锁。递归死锁是在编程时很容易犯的错误。
另一种死锁的情况就是多个线程分别获取一部分资源,并且等待循环等待其他线程已经获取的资源。
避免死锁有一般的银行家算法,该算法假设每个客户有可能在没有得到最大资源的情况下也能工作。银行家算法对每一个请求进行检查,如果它会导致不安全状态,则不满足该请求,否则便满足。检查状态是否安全是看是否有足够的资源满足距最大需求最近的客户。
对于每个线程都需要得到最大资源才能工作的情况下,避免死锁有如下的一般编程实践:
(1)请勿尝试在可能会对性能造成不良影响的长时间操作(如 I/O)中持有锁;
(2)请勿在可能直接或间接递归调用自己的函数里持有锁;
(3)一般情况下,请先使用粗粒度锁定方法,确定瓶颈,并在必要时添加细粒度锁定来缓解瓶颈。大多数锁定都是短期持有,而且很少出现争用。因此,请仅修复测得争用的那些锁定;
(4)使用多个锁定时,通过确保所有线程都按相同的顺序获取锁定来避免死锁;
(5)在等待某个资源时,使用超时机制;
(6)在系统中使用一个定时检查死锁环的机制,如果发现死锁就让一个线程的资源释放掉(数据库好像就是用这种方式)。
导致死锁的最常见情况是自死锁或递归死锁。在自死锁或递归死锁中,线程尝试获取已被其持有的锁。递归死锁是在编程时很容易犯的错误。
另一种死锁的情况就是多个线程分别获取一部分资源,并且等待循环等待其他线程已经获取的资源。
避免死锁有一般的银行家算法,该算法假设每个客户有可能在没有得到最大资源的情况下也能工作。银行家算法对每一个请求进行检查,如果它会导致不安全状态,则不满足该请求,否则便满足。检查状态是否安全是看是否有足够的资源满足距最大需求最近的客户。
对于每个线程都需要得到最大资源才能工作的情况下,避免死锁有如下的一般编程实践:
(1)请勿尝试在可能会对性能造成不良影响的长时间操作(如 I/O)中持有锁;
(2)请勿在可能直接或间接递归调用自己的函数里持有锁;
(3)一般情况下,请先使用粗粒度锁定方法,确定瓶颈,并在必要时添加细粒度锁定来缓解瓶颈。大多数锁定都是短期持有,而且很少出现争用。因此,请仅修复测得争用的那些锁定;
(4)使用多个锁定时,通过确保所有线程都按相同的顺序获取锁定来避免死锁;
(5)在等待某个资源时,使用超时机制;
(6)在系统中使用一个定时检查死锁环的机制,如果发现死锁就让一个线程的资源释放掉(数据库好像就是用这种方式)。
多线程之避免死锁
数据库死锁导致网站站点访问不了之解决方案
java多线程设计模式详解之四
面向对象多线程编程之 前言
java多线程设计模式详解之四
面向对象多线程编程之 前言
深入浅出Win32多线程程序设计之线程通信
编写多线程的Java应用程序-如何避免当前编程中最常见的问题
编写多线程的Java应用程序-如何避免当前编程中最常见的问题
多线程编程(16) - 多线程同步之 WaitableTimer (等待定时器对象)[续二]
高级应用 java多线程设计模式详解之三
孙鑫VC视频教程笔记之第十五课“多线程与聊天室”
Linux多线程 Linux多线程
用TRY/CATCH解决SQL2005的死锁
如何在 DB2 UDB 中监控死锁
java多线程
多线程错误
python 多线程
多线程编程
多线程编程
多线程编程
中国汽车企业避免早衰之思考
如何在?DB2?UDB?中监控死锁1
温家宝阐释中国经济避免“二次探底”之道-搜狐新闻