проблема с блокировкой Петерсона в разделяемой памяти

Я реализовал алгоритм Петерсона для взаимного исключения в разделяемой памяти. Я использую разделяемую память между c ++ и java-процессом (используя jni) для связи. Проблема в том, что я все еще как-то вижу состояние гонки. Если я попытаюсь отладить его с помощью printf / println, код начнет работать нормально, но как только я удалю эти отпечатки, процессы остановятся. Может кто-нибудь просветить меня, в чем может быть проблема? Я совершенно уверен, что реализация алгоритма Петерсона верна. Должен ли я использовать семафоры (semget ()) вместо взаимного исключения?


person Neal    schedule 11.06.2011    source источник


Ответы (3)


Чтобы правильно реализовать алгоритм, вы должны использовать барьеры, чтобы гарантировать, что память читается / записывается в том порядке, который вы указываете в коде. Прочтите второй абзац здесь:

Большинство современных процессоров переупорядочивают доступ к памяти для повышения эффективности выполнения (см. Порядок памяти, чтобы узнать о типах разрешенного переупорядочения). Такие процессоры неизменно дают возможность принудительно упорядочить поток обращений к памяти, обычно с помощью инструкции барьера памяти. Реализация алгоритмов Петерсона и связанных с ним на процессорах, которые изменяют порядок доступа к памяти, обычно требует использования таких операций для правильной работы, чтобы не допустить выполнения последовательных операций в неправильном порядке. Обратите внимание, что изменение порядка доступа к памяти может происходить даже на процессорах, которые не изменяют порядок инструкций (например, процессор PowerPC в Xbox 360).

И да, используйте механизмы синхронизации, предоставляемые системой (мьютексы), вместо того, чтобы изобретать колесо.

person Yakov Galka    schedule 11.06.2011
comment
Надо было подумать о переупорядочивании памяти! В любом случае большое спасибо. Сейчас буду использовать мьютексы. - person Neal; 12.06.2011

Думаю, ваша проблема связана не с взаимоисключением, а с синхронизацией. Алгоритм Петерсона защищает только один процесс, находящийся в критической области, и не определяет, какие процессы должны находиться в критической области. Если ваша проблема соответствует тому, о чем я упоминал, я предлагаю использовать Moniter в качестве синхронизатора.

person ganadara    schedule 20.03.2012

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

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

Не могли бы вы рассказать, какую логику вы используете для АЛГОРИТМА ПЕТЕРСОНА?

Посетите: Алгоритм Петерсона

person Pirate    schedule 07.09.2017