避免多线程进程中的死锁

时间:2009-06-25 13:28:31

标签: multithreading deadlock idioms

为了避免死锁,有人应该遵循哪些最佳做法/习惯用法?

6 个答案:

答案 0 :(得分:9)

答案 1 :(得分:7)

发生死锁必须发生four conditions

  1. 互斥条件:一次不能被多个进程使用的资源

  2. 保持和等待条件:已持有资源的流程可能会请求新资源

  3. 没有抢占条件:没有资源可以从持有它的进程中强行删除,资源只能通过流程的显式操作释放

  4. 循环等待条件:两个或多个进程形成一个循环链,每个进程等待链中下一个进程持有的资源

  5. 至少避免其中一种,最好是更多,你不应该有太多问题。

答案 2 :(得分:3)

有所谓的Banker's algorithm,用于避免死锁。您还可以考虑使用Watch Dog来突破表单死锁。 Here也很少有趣点。

答案 3 :(得分:1)

避免死锁的规范技术是拥有锁定层次结构。确保所有线程以相同的顺序获取锁或其他资源。这避免了死锁情况,其中线程1持有锁A并且需要锁B而线程2持有锁B并且需要锁A.使用锁层次结构,两个线程都必须以相同的顺序获取锁(例如,B之前的A)

答案 4 :(得分:0)

最佳做法是为您的线程定义一个类,并在线程中仅使用此类中的非静态字段,这样您的线程就不会共享任何内存。
当然,为避免死锁,您还可以避免使用信号量,关键部分和互斥锁。如果你想避免死锁,那就更好了。不幸的是,如果在两个线程之间共享某些内存或其他资源,则需要这些内容,否则您可能会损坏数据。

答案 5 :(得分:-2)

在进入关键部分的各种方法中 - 信号量和互斥量是最受欢迎的。

  • 信号量是一种等待机制,而互斥锁是一种锁定机制,这个概念最让人困惑,但简而言之,激活互斥锁的线程只能停用它。考虑到这一点......

  • 如果进程需要5个资源,请不要让任何进程锁定部分资源,等待所有资源都可用。

  • 如果你在这里使用信号量,你可以解锁/取消等待其他线程占用的资源。我的意思是先发制人是另一个原因。

这两个根据我的基本条件,其余2个共同的4个注意事项可以与这些相关。

如果你不同意ps添加评论。我已经迟到了,我稍后会添加一个更清晰,更清晰的解释。