boost::interprocess::message_queue сбой в работе очереди
От: varga  
Дата: 28.05.10 06:24
Оценка:
Привет, всем!

Появилась проблема при использовании boost::interprocess::message_queue(boost 1.42) —
это именованная глобальная очередь сообщений, в которую можно писать/читать из разных процессов

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

Если один из процессов аварийно завершается (ловит сигфолт) а в это время один из его потоков
выполенял операции try_send/try_receive в это же самое время, то очередь переходит в "заблокированное состояни".

После такого проишествия ни один из процессов не может более выполнить операции с очередью.
Вызов функций try_send/try_receive блокируют поток, вызваший их.

Запустил под отладчиком процесс после очередного фатального завершения процесса и оказалось, что поток блокируется
на функции message_queue::do_send(block_t block, ...) на инструкции:

line 448: scoped_lock<interprocess_mutex> lock(p_hdr->m_mutex);



Как я понимаю фатально завершившийся поток выполнил lock для межпроцессорного мьютекса p_hdr->m_mutex, а соответствующий
unlock выполнить не успел.

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

Существует ли возможность определить, что очередь оказалась в такой "нештатной" блокировке, и вернуть очередь в рабочее состояние?


--
Дмитрий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.