проблема в блокировке петерсона в разделяемой памяти - PullRequest
1 голос
/ 12 июня 2011

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

Ответы [ 3 ]

4 голосов
/ 12 июня 2011

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

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

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

0 голосов
/ 07 сентября 2017

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

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

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

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

0 голосов
/ 20 марта 2012

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

...