Я был обеспокоен тем, что может быть условие, когда мьютекс в разделяемой памяти может не работать должным образом, поэтому я немного покопался и пришел к некоторым документам, которые рассматривают проблему как легкую задачу:
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 и т. Д.?