Я нашел это: Быстро межпроцессный метод синхронизации
Я раньше полагал, что pthread взаимное исключение может только быть совместно использовано двумя потоками в том же адресном пространстве.
Вопрос / ответы там, кажется, подразумевает:
Если у меня есть два отдельных процесса A & B. У них есть общая память регион M. Я могу поместить pThread взаимное исключение в M, привязать A, привязать B, разблокировать в A; и B больше не будет блокироваться на взаимном исключении. Это корректно? Взаимные исключения pThread могут быть совместно использованы в двух отдельных процессах?
Править: Я использую C++ на MacOSX.
Вам нужно указать мьютексу быть разделяемым между процессами при его запуске:
http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_mutexattr_setpshared.html
Обратите внимание, в частности, на "Значение атрибута по умолчанию - PTHREAD_PROCESS_PRIVATE", что означает, что доступ к нему из разных процессов является неопределенным поведением.
Если ваша библиотека C/pthread соответствует требованиям, вы сможете определить, поддерживает ли она мьютексы, разделяемые между несколькими процессами, проверив, определен ли тестовый макрос _POSIX_THREAD_PROCESS_SHARED
в значении, отличном от -1
, или запросив конфигурацию системы во время выполнения с помощью sysconf(_SC_THREAD_PROCESS_SHARED)
если этот тестовый макрос не определен.
EDIT: Как указал Стив, вам нужно будет явно настроить мьютекс для совместного использования между процессами, если платформа поддерживает эту возможность, как я описал выше.
Я был обеспокоен тем, что может возникнуть ситуация, при которой мьютекс в общей памяти может не работать должным образом, поэтому я немного покопался и нашел некоторые документы которые рассматривают проблему как простую задачу:
https://computing.llnl.gov/tutorials/pthreads/
Дальнейшее копание, однако, показало, что в более старых версиях glibc возникали проблемы с мьютексами общей памяти: (Это изменение является давним, но оно иллюстрирует суть.)
in linuxthreads/mutex.c
int __pthread_mutexattr_setpshared(...) {
/* For now it is not possible to shared a conditional variable. */
if (pshared != PTHREAD_PROCESS_PRIVATE)
return ENOSYS;
}
Без более подробной информации о том, какую реализацию pthread вы используете, трудно сказать, в безопасности вы или нет.
Меня беспокоит то, что многие реализации (и некоторые целые языки, такие как perl, python и ruby) имеют глобальный объект блокировки, который управляет доступом к общим объектам. Этот объект не будет использоваться совместно между процессами, и поэтому, хотя ваши мьютексы, вероятно, будут работать большую часть времени, вы можете обнаружить, что у вас есть два процесса, одновременно управляющих мьютексом.
Я знаю, что это противоречит определению мьютекса, но это возможно:
Если два потока работают одновременно в разных процессах, это означает, что они находятся на разных ядрах. Оба получают свой глобальный объект блокировки и переходят к управлению мьютексом в разделяемой памяти.Если реализация pthread принудительно обновляет мьютекс через кеши, оба потока могут в конечном итоге обновиться одновременно, считая, что они удерживают мьютекс. Это просто возможный вектор отказа, который приходит на ум. Могло быть сколько угодно других. Каковы особенности вашей ситуации - ОС, версия pthreads и т. Д.?