Требования к трансляции и сборке многопоточного приложения

Исходный текст многопоточного приложения должен транслироваться с опцией -T прекомпилятора, иначе при попытке использования контекстов будет выдана ошибка «Отсутствует опция -T в вызове прекомпилятора». Трансляция с опцией -T приводит к подмене предложений встроенного SQL на вызов функций из библиотеки, разработанной для многопоточных приложений (многопоточной библиотеки).

При сборке приложения должна подсоединяться версия многопоточной библиотеки.

Особенности сборки многопоточных приложений:

  1. дескрипторы соединений с БД, заданные неявно (без модификатора AT < имя соединения >), различны для разных контекстов;

  2. если происходит обращение к глобальным дескрипторам предложений встроенного SQL, то эти вызовы необходимо синхронизировать (используя семафоры, критические секции и т.д.), иначе произойдет нарушение внутренних структур библиотеки;

  3. особенности интерфейса нижнего уровня (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
. . .
}