Здравствуйте, varga, Вы писали:
V>V>line 448: scoped_lock<interprocess_mutex> lock(p_hdr->m_mutex);
V>
V>Как я понимаю фатально завершившийся поток выполнил lock для межпроцессорного мьютекса p_hdr->m_mutex, а соответствующий
V>unlock выполнить не успел.
V>Я так понимаю проблема состоит в том, что межпроцессорный мьютекс никак не связан с процессом, который его использует,
V>поэтому падение процесса не приводит к его разблокировке.
V>Существует ли возможность определить, что очередь оказалась в такой "нештатной" блокировке, и вернуть очередь в рабочее состояние?
Если это именно мьютекс, то ОС освободит его при смерти процесса. Скорее всего там используется не мьютекс, а семафор или что-то самопальное.
В целом такая возможность есть, такая синхронизация называется robust IPC. В Windows мьютексы всегда robust, при смерти владеющего процесса WaitForSingleObject() вернёт WAIT_ABANDONED, это значит, что процессу надо "восстановить" состояние после умершего процесса до разблокировки мьютекса. В POSIX мьютекс надо явно инициализировать как robust с помощью pthread_mutexattr_setrobust(), тогда процесс будет получать EOWNERDEAD после смерти владеющего процесса, и после восстановления надо явно пометить данные как консистентные с помощью pthread_mutex_consistent().
Только учти, что что бы "восстанавливать" данные, вся работа под мьютексом должна быть написана в стиле lock-free (с помощью упорядоченных атомарных операций), т.к. данные после обычного C/C++ кода восстановить не удастся.
Плюс есть такие моменты, как например нельзя отдельно выделить память под сообщение, а потом отдельно поместить сообщение в очередь — при таком подходе начнутся утечки памяти. Выделение памяти и помещение в очередь должны быть так или иначе связаны, что бы их можно было целиком восстановить (в частности освободить память, если сообщение так и не попало в очередь).