Правильность моей реализации подсчета семафора с использованием двоичного семафора - PullRequest
0 голосов
/ 14 ноября 2018

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


Примечание

Я пытался выяснить недостаток своей реализации в течение многих дней ... Однако все онлайн-ссылки обсуждают только классический способ, поэтому я должен попытаться задать свой вопрос здесь. Заранее большое спасибо.

...