Я изучаю алгоритм многоразового барьера из книги "Маленькая книга семафоров", доступной здесь http://greenteapress.com/semaphores/downey08semaphores.pdf
Головоломка на стр. 31 (Основные шаблоны синхронизации / Многоразовый барьер), и я нашел «решение» (или нет), которое отличается от решения из книги (двухфазный барьер).
Это мой «код» для каждой темы:
# n = 4; threads running
# semaphore = n max., initialized to 0
# mutex, unowned.
start:
mutex.wait()
counter = counter + 1
if counter = n:
semaphore.signal(4) # add 4 at once
counter = 0
mutex.release()
semaphore.wait()
# critical section
semaphore.release()
goto start
Кажется, это работает, я даже вставил разные таймеры сна в разные секции потоков, и они все еще ждут всех потоков, прежде чем продолжать каждый цикл. Я что-то пропустил? Есть ли условие, что это не удастся?
Я реализовал это с помощью функций семафора и Mutex библиотеки Windows.
Обновление:
Спасибо starblue за ответ. Оказывается, что если по какой-либо причине поток будет медленным между mutex.release()
и semaphore.wait()
, то любой из потоков, поступающих на semaphore.wait()
после полного цикла, сможет снова пройти, поскольку будет один из N неиспользованных осталось сигналов.
И, поставив команду Sleep для потока № 3, я получил такой результат http://pastebin.com/raw.php?i=FfXcCMZ3, где можно увидеть, что поток 3 пропустил поворот в первый раз, причем поток 1 выполнил 2 оборота, а затем догонял на втором повороте (который фактически был его первым поворотом).
Еще раз спасибо всем за ввод.