Да, такая ситуация действительно может возникнуть в tcl, скомпилированном с TCL_MEM_DEBUG, если поток, в данный момент вызывающий IsShared, IncrRefCount или DecrRefCount и т. Д., Но еще не создал ни одного объекта . Фактически таблица объектов создается для каждого потока в его TSD в функции TclDbInitNewObj (так по требованию, если первый объект создается в потоке) ...
Так что я предполагаю, что некоторый объект obj создается в потоке Th1 и передается в поток Th2, но поток Th2 до сих пор не создал ни одного объекта. Обычно это никогда не происходит, потому что в самом потоке создается интерпретатор (и во время фазы инициализации будет создано несколько объектов). Только что вы написали выше:
мы создаем новый интерпретатор TCL (Tcl_CreateInterp), затем мы создаем новый поток, где мы используем этот интерпретатор.
Хотя я неЯ думаю, что это хорошая идея (чрезмерное использование потокового хранилища и т. д.), но я думаю, что это может быть немного неожиданным поведением с нашей стороны, и если мы сможем, мы должны это исправить.
Пока это все ещене исправлено, так как для обхода просто создайте 1 пустой объект в каждом потоке, работающем с tcl-объектами в вашем приложении, например:
#ifdef TCL_MEM_DEBUG
if (1) { Tcl_Obj *objPtr = Tcl_NewObj(); Tcl_DecrRefCount(objPtr); };
#endif