如果保证相互排斥,比如使用信号量,那么程序是否会无死锁?

时间:2013-03-05 04:15:00

标签: multithreading deadlock semaphore mutual-exclusion

我分别定义了互斥和死锁,如下所示: 如果在每个时刻,每个共享资源被分配给恰好一个进程或可用,则存在互斥条件。 如果集合中的每个进程都在等待集合中只有另一个进程可能导致的事件,则一组进程会死锁。

比如说,使用二进制信号量,确保其中只有一个可以同时进入其关键区域。由于每个流程在进入其关键区域之前都会向下运行,而在离开之后向上运行,因此可以保证相互排斥。

据我所知,有四个条件必须能够解决死锁,其中一个是互斥条件(在它们的关键部分中不能同时有两个进程)。

由于保证了互斥,该程序在这种情况下是无死锁的吗?

问候。

1 个答案:

答案 0 :(得分:6)

不一定。想象一下这两个主题:

 Thread 1          Thread 2
 ============      =============
 Acquire A         Acquire B
 Acquire B         Acquire A
 Release B         Release A
 Release A         Release B

在这里,确实保证互斥 - 在每个瞬间,信号量A和B要么由其中一个线程拥有,要么在系统范围内可用 - 但是如果线程1和2各自获得它们的第一个锁定(线程为A),则仍然可能出现死锁1,B代表线程2),但随后会死锁,等待对方持有的资源。

希望这有帮助!