Автоматически освобождать мьютекс при сбоях в Unix - PullRequest
2 голосов
/ 11 ноября 2010

У меня есть две программы, взаимодействующие через сегмент общей памяти. При использовании сегмента для чтения или записи они удерживают блокировку.

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

Другие вопросы указывают путь к ответу в Windows, Java и т. Д., Но как вы это делаете в Unix (и особенно в Linux)?

(Я не привязан к мьютексным функциям pthreads; семафоры SysV или что-то еще подойдут просто отлично.)

Ответы [ 3 ]

8 голосов
/ 11 ноября 2010

Я считаю, что вам нужны надежные мьютексы POSIX:

http://www.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getrobust.html

2 голосов
/ 11 ноября 2010

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

0 голосов
/ 11 ноября 2010

Семафоры System V поддерживают опцию SEM_UNDO, чтобы сделать именно это. Однако, в отличие от надежных мьютексов, это не будет уведомлять следующий поток о получении блокировки. С другой стороны, они более портативны, чем надежные мьютексы.

...