Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Igors от Август 21, 2010, 23:35



Название: Рекурс в смешанном коде
Отправлено: Igors от Август 21, 2010, 23:35
Добрый день

Есть несколько ниток выполняющих однотипную работу параллельно. Все они могут вызывать плагины (dll). Но дело в том что не все плагины thread-safe (потокобезопасны). Решение простое: защищаю вызов каждого плагина своим мутексом

Код
C++ (Qt)
QMutexLocker lock(&mutex_1);
CallPlug_1();
 

Все хорошо, работает (вместо мутекса используется др примитив но суть та же самая). Только 1 нитка может вызвать "опасный" код. остальные будут ждать. Но вот проблема: некоторые плагины рекурсивны. То есть изнутри CallPlug_1 вызовется хост, которому опять может понадобиться вызов CallPlug_1 (глубина рекурсии устанавливается пользователем). Понятно что получаю dead lock с таким плагином. Мне известно место где плагин обратился к хосту, но если попробую отпереть мутекс - налетят др. нитки и плагин рухнет. Что будем делать?
 
Спасибо

Edit: поторопился запостить - решение оказалось совсем простым  :)


Название: Re: Рекурс в смешанном коде
Отправлено: Rcus от Август 22, 2010, 00:44
enum QMutex::RecursionMode?


Название: Re: Рекурс в смешанном коде
Отправлено: Igors от Август 22, 2010, 00:49
enum QMutex::RecursionMode?
Точно  :)