Библиотека Tcl использует пул памяти с привязкой к потокам, чтобы (в огромной степени!) Уменьшить нагрузку на глобальные блокировки, вследствие чего каждый объект интерпретатора Tcl также сильно привязан к потоку, который его создал. (Это модель многоквартирного потока, если вы с ней знакомы.) Вы не можете безопасно использовать интерпретатор Tcl из любого другого потока. Если вы хотите иметь доступ к интерпретатору Tcl в каждом потоке, каждый поток должен создать свой собственный интерпретатор и использовать его.
Существует несколько операций, обеспечивающих безопасное взаимодействие между потоками, в частности Tcl_ThreadQueueEvent()
и Tcl_ThreadAlert()
, которые позволяют подавать сообщение для обработки другим потоком, когда он будет готов (каждый поток с интерпретатором Tcl включен с ней связана очередь событий внутри библиотеки Tcl; это ядро механизма уведомлений о событиях Tcl).
Рекомендуется использовать пакет потоков Tcl (который должен быть частью любой хорошей установки Tcl 8.6 и также доступен для более старых версий) для работы между потоками в Tcl. Помимо сложности того, что каждая сторона знает, каков дескриптор для другого потока, его очень легко использовать.