"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)

--
Хорсун Влад


Ответить