Re: boost::interprocess::message_queue сбой в работе очереди
От: remark Россия http://www.1024cores.net/
Дата: 28.05.10 08:56
Оценка: 4 (3)
Здравствуйте, 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++ кода восстановить не удастся.
Плюс есть такие моменты, как например нельзя отдельно выделить память под сообщение, а потом отдельно поместить сообщение в очередь — при таком подходе начнутся утечки памяти. Выделение памяти и помещение в очередь должны быть так или иначе связаны, что бы их можно было целиком восстановить (в частности освободить память, если сообщение так и не попало в очередь).



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.