Требования к трансляции и сборке многопоточного приложения
Исходный текст многопоточного приложения должен транслироваться с опцией -T прекомпилятора, иначе при попытке использования контекстов будет выдана ошибка «Отсутствует опция -T в вызове прекомпилятора». Трансляция с опцией -T приводит к подмене предложений встроенного SQL на вызов функций из библиотеки, разработанной для многопоточных приложений (многопоточной библиотеки).
При сборке приложения должна подсоединяться версия многопоточной библиотеки.
Особенности сборки многопоточных приложений:
-
дескрипторы соединений с БД, заданные неявно (без модификатора
AT <имя соединения>), различны для разных контекстов; -
если происходит обращение к глобальным дескрипторам предложений встроенного SQL, то эти вызовы необходимо синхронизировать (используя семафоры, критические секции и т.д.), иначе произойдет нарушение внутренних структур библиотеки;
-
особенности интерфейса нижнего уровня (Call-интерфейса) СУБД ЛИНТЕР требуют, чтобы первое обращение к СУБД из текущей сессии было сделано из одного потока. Это связано с особенностями заполнения его внутренних структур. Иначе возможно появление ошибки СУБД ЛИНТЕР «Ошибка приема сообщения».
Ниже приведены два схематичных примера, показывающих, как можно использовать контексты в многопоточных приложениях.
Пример использования одного контекста несколькими потоками
allocate :ctx
use :ctx
connect
spawning threads...
free :ctx
thread 1,2.. ()
{
USE :ctx
mutex
…
unmutex
}
Пример использования раздельных контекстов несколькими потоками
allocate :ctx1
allocate :ctx2
…
spawning threads...
free :ctx1
free :ctx2
…
thread 1,2.. ()
{
USE :ctx1,2 ..
connect
…
}