Многоразовые барьеры с использованием семафора

Я просматривал обсуждение многоразовых барьеров в «Маленькой книге семафоров». Я записал это решение (ниже), прежде чем проверять ответ в книге. Поскольку решение в книге немного сложнее (два турникета), я предполагаю, что здесь я упустил что-то очевидное. Может ли кто-нибудь помочь мне указать на какие-либо проблемы с ним?

# count = 0;
# mutex = semaphore(1);
# barrier = semaphore(0);

# rendezvous point

mutex.wait();
    count = count + 1;
    if (count == n) barrier.signal();
mutex.signal();

barrier.wait();

mutex.wait();
    count = count - 1;
    if (count != 0) barrier.signal();
mutex.signal();

# critical point

Для справки, вот предложенное в книге решение с использованием двух турникетов (барьер1 и шлагбаум2)

# count = 0; 
# mutex = semaphore(1); 
# barrier1 = semaphore(0); 
# barrier2 = semaphore(1); 

# rendezvous point  

mutex.wait(); 
    count = count + 1; 
    if (count == n) 
        barrier2.wait(); 
        barrier1.signal(); 
mutex.signal(); 

barrier1.wait(); 
barrier1.signal(); 

# critical point

mutex.wait(); 
    count = count – 1; 
    if (count == 0) 
        barrier1.wait(); 
        barrier2.signal(); 
mutex.signal(); 

barrier2.wait(); 
barrier2.signal(); 

person Colonel Panic    schedule 10.07.2016    source источник
comment
Обсуждался тот же вопрос, заданный позже здесь. Вы упустили возможность повторного входа первого возобновленного процесса в барьер до того, как другие процессы покинут его.   -  person nnovich-OK    schedule 24.01.2017