5

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

4

6 回答 6

9

请参阅死锁的常见原因是什么?

于 2009-06-25T13:30:20.690 回答
7

发生死锁必须满足四个条件:

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

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

  3. 无抢占条件:任何资源都不能从持有它的进程中强制移除,资源只能通过进程的显式动作释放

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

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

于 2009-06-25T20:39:08.980 回答
4

有所谓的银行家算法,用于避免死锁。您也可以考虑使用Watch Dog来打破表单死锁。这里也有几个有趣的点。

于 2009-06-25T13:47:45.880 回答
1

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

于 2009-06-25T13:37:40.300 回答
0

最佳做法是为您的线程定义一个类,并在您的线程中仅使用此类中的非静态字段,这样您的线程就不会共享任何内存。
当然,为了避免死锁,您也可以避免使用信号量、临界区和互斥锁。越少越好,如果你想避免死锁。不幸的是,如果某些内存或其他资源在两个线程之间共享,则这些是必需的,否则您将面临数据损坏的风险。

于 2009-06-25T13:51:12.020 回答
-2

在进入临界区的各种方法中——信号量和互斥锁是最流行的。

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

  • 不允许任何进程锁定部分资源,如果一个进程需要 5 个资源,则等到所有资源都可用。

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

这2个在我看来是基本情况,常见的4个注意事项中剩下的2个可以和这些有关。

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

于 2009-06-29T12:12:51.377 回答