Многоразовый барьерный алгоритм - PullRequest
3 голосов
/ 19 февраля 2011

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

Еще раз спасибо всем за ввод.

1 Ответ

3 голосов
/ 19 февраля 2011

Один поток может проходить несколько раз через барьер, в то время как другой поток вообще не работает.

...