Параметры интерпретатора tcl загрязнены - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть многопоточная программа C ++, в которой основной поток создает два интерпретатора tcl, interp # 1 и interp # 2.Во время параллельного запуска основной поток и один подчиненный поток пытаются каждый раз вызывать разные cmds через interp # 1 и interp # 2 по отдельности.В какой-то момент происходит ошибка памяти и происходит сбой программы.Файл журнала сообщает мне, что некоторое значение kObjv [] для interp # 1 загрязнено значением для interp # 2.Я также запускаю helgrind для проверки возможных гонок данных, и он сбрасывает множество рисков гонок данных под tcl lib apis, например: Tcl_NewStringObj / TclFreeObj / ResetObjResult / TclNREvalObjv и т. Д.

Похоже, что основная память используется совместнопереводчики из той же ветки.Это правда?Моя программа связывает статическую библиотеку tcl 8.6, которая была установлена ​​с включенным потоком.

1 Ответ

1 голос
/ 18 апреля 2019

Библиотека Tcl использует пул памяти с привязкой к потокам, чтобы (в огромной степени!) Уменьшить нагрузку на глобальные блокировки, вследствие чего каждый объект интерпретатора Tcl также сильно привязан к потоку, который его создал. (Это модель многоквартирного потока, если вы с ней знакомы.) Вы не можете безопасно использовать интерпретатор Tcl из любого другого потока. Если вы хотите иметь доступ к интерпретатору Tcl в каждом потоке, каждый поток должен создать свой собственный интерпретатор и использовать его.

Существует несколько операций, обеспечивающих безопасное взаимодействие между потоками, в частности Tcl_ThreadQueueEvent() и Tcl_ThreadAlert(), которые позволяют подавать сообщение для обработки другим потоком, когда он будет готов (каждый поток с интерпретатором Tcl включен с ней связана очередь событий внутри библиотеки Tcl; это ядро ​​механизма уведомлений о событиях Tcl).

Рекомендуется использовать пакет потоков Tcl (который должен быть частью любой хорошей установки Tcl 8.6 и также доступен для более старых версий) для работы между потоками в Tcl. Помимо сложности того, что каждая сторона знает, каков дескриптор для другого потока, его очень легко использовать.

...