Linux межпроцессный реентрантный семафор - PullRequest
1 голос
/ 17 ноября 2009

Я портирую приложение Windows на Linux и у меня проблема с синхронизацией.

В Windows я использую системный уровень с именем mutex для синхронизации доступа к блоку общей памяти.

Как мне эмулировать это в Linux? Я создал семафор SystemV, используя semget. Проблема в том, что он не реентерабельный, если я его уже держу, он заблокируется, в отличие от Windows. Я мог бы добавить к нему счетчик ссылок, но тогда мне нужно было бы синхронизировать доступ к этому, что означает другой (на этот раз только для текущего процесса) мьютекс.

Есть ли где-нибудь класс, обеспечивающий повторную входящую межпроцессную блокировку (возможно в Boost)?

Кстати, использование блокировки файлов недопустимо, так как она, вероятно, будет слишком медленной (мне нужна связь со сверхнизкой задержкой между двумя процессами).

Ответы [ 2 ]

6 голосов
/ 17 ноября 2009

Вы можете просто использовать shared (межпроцессный), рекурсивный pthread_mutex_t. Создайте обычный pthread_mutex (хранящийся в общей памяти) и установите его атрибуты, используя pthread_mutexattr_settype с флагом PTHREAD_MUTEX_RECURSIVE, а затем вызовите pthread_mutexattr_setpshared с флагом PTHREAD_MUTEX_SHARED.

Это даст вам возвратную межпроцессную блокировку.

1 голос
/ 17 ноября 2009

Вы можете попробовать создать свой собственный из futexes . Смотрите usersem.c в этом архиве .

...