我知道已经回答了许多相关问题,并且我已经阅读了许多问题。我了解经典实现的工作原理以及三个二进制信号量中每个信号量的必要性。但是,当我尝试不记得经典方式并独自写下实施时,我制定了另一种不同于经典的实现。我无法确定我的实现是否会出错。我将两种方式都放在下面。 S代表对信号量计数,C代表S的值,S1,S2,S3代表三个二进制信号量。
P(S):
P(S3)
P(S1)
C--
if C < 0:
V(S1)
P(S2)
else:
V(S1)
V(S3)
V(S):
P(S1)
C++
if C <= 0:
V(S2)
V(S1)
P(S):
P(S3)
while C <= 0:
;
P(S1)
C--
V(S1)
V(S3)
V(S):
P(S1)
C++
V(S1)
两种方式之间的主要区别是繁忙等待的位置。繁忙的经典方式是等待二进制信号量S2,而繁忙的方式是等待while循环。我的实现仍然正确吗?还是有任何问题导致我的实施不那么受欢迎? (据我所知,他们都在忙着等待。)
我已经尝试找出实现方法的缺陷很多天了...但是,在线参考文献都仅在讨论经典方法,因此我不得不在这里尝试问我一个问题。提前谢谢。