Я хочу использовать lock-free algorithm
для совместной памяти, чтобы избежать мьютекса. У меня есть некоторые процессы, которые совместно используют данные, использующие общую память. Если процесс блокирует мьютекс и аварийно завершает работу, все остальные процессы также аварийно завершают работу.
Я прочитал некоторые статьи, в которых реализован алгоритм без блокировки со связанным списком. Но в моей общей памяти я не могу определить структуру данных для использования в этом блоке памяти. У меня есть только указатель на этот блок.
Так что у меня нет идей применить алгоритм без блокировки в моей ситуации. Мне нужна помощь от вас. Спасибо и извините, если мой английский очень плохой.
Если процесс блокирует мьютекс и аварийно завершает работу, все остальные процессы также аварийно завершают работу.
Специально для этого варианта использования есть надежные мьютексы:
PTHREAD_MUTEX_ROBUST
Если процесс, содержащий поток-владелец надежного мьютекса, завершается при удержании блокировки мьютекса, следующий поток, который получает мьютекс, должен быть уведомлен о завершении возвращаемым значением [EOWNERDEAD] из функции блокировки. Если поток-владелец надежного мьютекса завершается, удерживая блокировку мьютекса, следующий поток, который получает мьютекс, может быть уведомлен о завершении с помощью возвращаемого значения [EOWNERDEAD]. Затем уведомленный поток может попытаться снова пометить состояние, защищенное мьютексом, как непротиворечивое с помощью вызова pthread_mutex_consistent (). После последующего успешного вызова pthread_mutex_unlock () блокировка мьютекса должна быть снята и может нормально использоваться другими потоками. Если мьютекс разблокирован без вызова pthread_mutex_consistent (), он должен быть постоянно недоступен, и все попытки заблокировать мьютекс завершатся неудачно с ошибкой [ENOTRECOVERABLE]. Единственная допустимая операция с таким мьютексом — это pthread_mutex_destroy ().
Других решений пока нет …