У меня вопрос: безопасно ли инициировать мьютекс PTHREAD_PROCESS_SHARED, сохранить его в отображенном файле и использовать его навсегда во многих процессах без вызова pthread_mutex_destroy () или повторно инициализировать его?
Разрешено, что разделяемый процессом мьютекс переживает процесс, который его инициализировал. Если вы сопоставите такой мьютекс с постоянным обычным файлом, его состояние будет сохраняться бесконечно, даже если ни один процесс не отобразил его. Пока поддерживается целостность его состояния, включая, но не ограничиваясь этим, ни один процесс, разрушающий его через pthread_mutex_destroy()
, новые процессы могут отобразить его и использовать. То есть семантика того, что вы описываете, четко определена.
Но действительно ли это безопасно ? Не особенно.
Первая проблема заключается в том, что вам нужно знать, когда его создавать, и вам следует избегать условий гонки, когда вы это делаете. Если вы полагаетесь на процессы, которые регулярно используют мьютекс, чтобы инициализировать его при необходимости, то вы должны убедиться, что именно он создает и инициализирует его, когда файл еще не существует.
Другая проблема заключается в том, что при использовании долгоживущий общий мьютекс, подобный этому, в значительной степени подвержен сбоям. Например, если происходит сбой программы при удержании мьютекса заблокированным, он останется заблокированным до тех пор, пока вы не предпримете какие-то действия по исправлению вручную. Или, если сопоставленный файл управляется напрямую, состояние мьютекса может быть легко повреждено, что приведет к неопределенному поведению во всех программах, использующих его, даже при перезагрузках.
Если вам действительно нужен долго сохраняющийся объект синхронизации, тогда я предложил бы рассмотреть семафор POSIX с именем . Это разработано для цели, принимая во внимание вышеупомянутые соображения и другие. Однако он несколько отличается тем, что такие семафоры находятся в ядре и имеют постоянство в ядре, поэтому они не сохраняются при перезагрузках (что обычно является хорошим ), и они не подвержены обычным манипуляциям с файлами .
В качестве альтернативы вы можете рассмотреть семафор System V . Это более старая реализация семафора, которая также имеет постоянство ядра. Его интерфейс значительно более громоздкий, чем у семафора POSIX, но у него есть несколько полезных функций, которых нет у семафора POSIX, таких как автоматическая разблокировка c, когда процесс, удерживающий один заблокированный, завершается (даже ненормально).