"Konstantin R. Beliaev" ...
>
> Я правильно понимаю, что если из нескольких тредов идет процесс
> подключение к разным базам (FB 1.5.3), то процессы подключения надо
> выстраивать в очередь мьютексами или чем-то еще?
> Если так, то возникает проблема: есть у нас неустойчивые каналы и
> периодически тред, захвативший мьютекс уходит в бесконечное ожидание,
> если удаленный хост не отвечает.
> Mutex.GetEx;
> try
> Database.Open; << виснет здесь
> finally
> Mutex.Release;
> end;{try}
> Причина сего неизвестна: обычно нормально отваливается по таймауту, а
> иногда ждет до бесконечности, пока его не прибьют, но при этом, сами
> понимаете, мьютекс не освобождается.
> Как бы побороть сей баг?
Переменная с флагом наличия неоконченного подключения, захват этой
переменной в цикле с помощью Interlocked ф-ций, при убиении потока киллер
сам освобождает этот флаг. На коленке :
var
dwThreadID : DWORD; // флаг с ИД потока, не занято = 0
коннект :
while InterlockedCompareExchange(dwThreadID, GetCurrentThreadID(), 0) <> 0 do
Sleep(10)
try
Database.Open;
finally
dwThreadID := 0;
raise;
end
убиение потока :
TerminateThread(hThreadToKill, ...);
InterlockedCompareExchange(dwThreadID , GetCurrentThreadID(), dwThreadIDToKill)
--
Хорсун Влад