Взаимные исключения pthread работают через потоки если в общей памяти?

Я нашел это: Быстро межпроцессный метод синхронизации

Я раньше полагал, что pthread взаимное исключение может только быть совместно использовано двумя потоками в том же адресном пространстве.

Вопрос / ответы там, кажется, подразумевает:

Если у меня есть два отдельных процесса A & B. У них есть общая память регион M. Я могу поместить pThread взаимное исключение в M, привязать A, привязать B, разблокировать в A; и B больше не будет блокироваться на взаимном исключении. Это корректно? Взаимные исключения pThread могут быть совместно использованы в двух отдельных процессах?

Править: Я использую C++ на MacOSX.

22
задан Community 23 May 2017 в 11:53
поделиться

3 ответа

Вам нужно указать мьютексу быть разделяемым между процессами при его запуске:

http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_mutexattr_setpshared.html

Обратите внимание, в частности, на "Значение атрибута по умолчанию - PTHREAD_PROCESS_PRIVATE", что означает, что доступ к нему из разных процессов является неопределенным поведением.

16
ответ дан 29 November 2019 в 05:36
поделиться

Если ваша библиотека C/pthread соответствует требованиям, вы сможете определить, поддерживает ли она мьютексы, разделяемые между несколькими процессами, проверив, определен ли тестовый макрос _POSIX_THREAD_PROCESS_SHARED в значении, отличном от -1, или запросив конфигурацию системы во время выполнения с помощью sysconf(_SC_THREAD_PROCESS_SHARED) если этот тестовый макрос не определен.

EDIT: Как указал Стив, вам нужно будет явно настроить мьютекс для совместного использования между процессами, если платформа поддерживает эту возможность, как я описал выше.

6
ответ дан 29 November 2019 в 05:36
поделиться

Я был обеспокоен тем, что может возникнуть ситуация, при которой мьютекс в общей памяти может не работать должным образом, поэтому я немного покопался и нашел некоторые документы которые рассматривают проблему как простую задачу:

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 и т. Д.?

1
ответ дан 29 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: