Требования к трансляции и сборке многопоточного приложения
Исходный текст многопоточного приложения должен транслироваться с опцией -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 . . . }