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