【发布时间】:2009-06-25 13:28:30
【问题描述】:
为了避免死锁,人们应该遵循哪些最佳做法/惯用语?
【问题讨论】:
标签: multithreading deadlock idioms
为了避免死锁,人们应该遵循哪些最佳做法/惯用语?
【问题讨论】:
标签: multithreading deadlock idioms
有four conditions 必须发生死锁:
互斥条件:一次不能被多个进程使用的资源
持有和等待条件:已经持有资源的进程可能会请求新资源
无抢占条件:不能从持有它的进程中强制移除资源,只能通过进程的显式动作释放资源
循环等待条件:两个或多个进程形成一个循环链,每个进程等待链中下一个进程持有的资源
至少避免其中一种,最好是更多,这样你就不会遇到太多问题。
【讨论】:
有所谓的Banker's algorithm,用于避免死锁。您也可以考虑使用Watch Dog 来打破表单死锁。 Here 也有一些有趣的地方。
【讨论】:
避免死锁的典型技术是有一个锁层次结构。确保所有线程以相同的顺序获取锁或其他资源。这避免了线程 1 持有锁 A 并需要锁 B 而线程 2 持有锁 B 并需要锁 A 的死锁情况。对于锁层次结构,两个线程必须以相同的顺序获取锁(例如,A 在 B 之前) .
【讨论】:
最佳做法是为您的线程定义一个类,并在您的线程中仅使用此类中的非静态字段,这样您的线程就不会共享任何内存。
当然,为了避免死锁,您也可以避免使用信号量、临界区和互斥锁。越少越好,如果你想避免死锁。不幸的是,如果两个线程之间共享一些内存或其他资源,则需要这些资源,否则您可能会损坏数据。
【讨论】:
在进入临界区的各种方法中——信号量和互斥锁是最流行的。
信号量是一种等待机制,互斥量是一种锁定机制,这个概念最容易混淆,但简而言之,激活互斥量的线程只能停用它。考虑到这一点...
不允许任何进程锁定部分资源,如果一个进程需要 5 个资源,则等到所有资源都可用。
我说的这2个是基本情况,常见的4个注意事项中剩下的2个可以和这些有关。
如果你不同意 ps 添加 cmets。 gtg 已经晚了,后面我会添加更清晰更清晰的解释。
【讨论】: