Страниц: [1]
  Печать  
Автор Тема: Многопоточный resmgr и дедлок  (Прочитано 2275 раз)
Camarada
Full Member
***
Offline Offline

Сообщений: 222


Просмотр профиля
« : Февраля 04, 2014, 05:11:42 pm »

Ситуация.
На входе и выходе mqueue.
По devctl даются задания, по devctl же забираются результаты.
Все это делается в двух параллельных потоках (в клиенте).
resmgr содержит две очереди, ограниченные по максимальному/минимальному количеству элементов (mqueue).
Так получается, что задания идут чуть чаще, но блокирование для этого и придумано, чтобы не зависеть от частоты вызовов посылки заданий и получения результатов.
Когда resmgr был однопоточным ситуации дедлока естественны. Так как один поток заблокируется на посылке задания, а другой не вынет вовремя результат, так как менеджер ресурсов занят и выходная очередь также будет переполнена.
Ну я подумал, что надо сделать его многопоточным, чтобы запрос на получение задания обрабатывался параллельно. Виснет все равно.
Причем devctl, который должен вынуть из выходной очереди отправляется из клиента, но в обработчик не попадает.
Перехватил я функцию resmgr_handle, и оказывается, что мое сообщение (призванное вынуть результат из очереди) IO_DEVCTL доставляется, но так как из своей функции я, конечно, вызываю родную resmgr_handle, то виснет именно в ней.

В чем может быть дело, куда дальше рыть. Буду крайне признателен. Smiley
Записан
Camarada
Full Member
***
Offline Offline

Сообщений: 222


Просмотр профиля
« Ответ #1 : Февраля 04, 2014, 05:21:44 pm »

Да вот трейс потока, который блокируется. Начинает приходить понимание почему, но нет понимания как с этим бороться.
Записан
Страниц: [1]
  Печать  
 
Перейти в: