Я знаю, что на многие вопросы уже даны ответы, и я прочитал многие из них. Я понимаю, как работает классическая реализация и необходимость каждого из трех двоичных семафоров. Но когда я старался не помнить классический способ и работал над записью реализации, я разработал другую реализацию, отличную от классической. Я не могу сказать, пойдет ли моя реализация неправильно. Я поставлю оба способа ниже. 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. Моя реализация по-прежнему правильна? Или есть какая-то проблема, которая делает мою реализацию менее предпочтительной? (Насколько я знаю, они все заняты в ожидании.)
Примечание
Я пытался выяснить недостаток своей реализации в течение многих дней ... Однако все онлайн-ссылки обсуждают только классический способ, поэтому я должен попытаться задать свой вопрос здесь. Заранее большое спасибо.