ross summer program:多线程之避免死锁

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 04:23:10
多线程之避免死锁

概念:死锁是指永久阻塞一组争用一组资源的线程。
导致死锁的最常见情况是自死锁或递归死锁。在自死锁或递归死锁中,线程尝试获取已被其持有的锁。递归死锁是在编程时很容易犯的错误。
另一种死锁的情况就是多个线程分别获取一部分资源,并且等待循环等待其他线程已经获取的资源。

避免死锁有一般的银行家算法,该算法假设每个客户有可能在没有得到最大资源的情况下也能工作。银行家算法对每一个请求进行检查,如果它会导致不安全状态,则不满足该请求,否则便满足。检查状态是否安全是看是否有足够的资源满足距最大需求最近的客户。

对于每个线程都需要得到最大资源才能工作的情况下,避免死锁有如下的一般编程实践:

(1)请勿尝试在可能会对性能造成不良影响的长时间操作(如 I/O)中持有锁;

(2)请勿在可能直接或间接递归调用自己的函数里持有锁;

(3)一般情况下,请先使用粗粒度锁定方法,确定瓶颈,并在必要时添加细粒度锁定来缓解瓶颈。大多数锁定都是短期持有,而且很少出现争用。因此,请仅修复测得争用的那些锁定;

(4)使用多个锁定时,通过确保所有线程都按相同的顺序获取锁定来避免死锁;

(5)在等待某个资源时,使用超时机制;

(6)在系统中使用一个定时检查死锁环的机制,如果发现死锁就让一个线程的资源释放掉(数据库好像就是用这种方式)。