理解Tcl_DeleteInterp()API

理解Tcl_DeleteInterp()API,tcl,Tcl,我对Tcl_DeleteInterp()API(在solaris上)有一些问题。我在应用程序中使用了这个Tcl_DeleteInterp()来删除解释器。我发现奇怪的是,使用这个API的进程挂起大约20分钟。我使用truss命令附加了该进程,发现该进程连续执行以下函数将近20分钟 15.6541 0.0002 -> libtcl8.4:Tcl_DeleteInterp(0x41748, 0x0, 0x0, 0x0) 15.6580 0.0039 -> libc:free(0x

我对Tcl_DeleteInterp()API(在solaris上)有一些问题。我在应用程序中使用了这个Tcl_DeleteInterp()来删除解释器。我发现奇怪的是,使用这个API的进程挂起大约20分钟。我使用truss命令附加了该进程,发现该进程连续执行以下函数将近20分钟

15.6541  0.0002 -> libtcl8.4:Tcl_DeleteInterp(0x41748, 0x0, 0x0, 0x0)
15.6580  0.0039   -> libc:free(0x288f8, 0x0, 0x0, 0x0)
15.6583  0.0003   -> libc:mutex_unlock(0xff0424e8, 0x0, 0x0, 0x0)
15.6584  0.0001   <- libc:free() = 0
15.6588  0.0004   -> libc:free(0x474b0, 0x0, 0x0, 0x0)*
...
...
15.6541 0.0002->libtcl8.4:Tcl_DeleteInterp(0x41748,0x0,0x0,0x0)
15.6580 0.0039->libc:free(0x288f8,0x0,0x0,0x0)
15.6583 0.0003->libc:mutex_unlock(0xff0424e8,0x0,0x0,0x0)
15.6584 0.0001 libc:free(0x474b0,0x0,0x0,0x0)*
...
...
有人能帮我解释一下为什么Tcl_DeleteInterp函数调用这些函数吗? 我还检查了Tcl_DeleteInterp()的实现,但没有找到任何线索


感谢您删除Tcl解释器上下文。作为其中的一部分,它会破坏解释器中的名称空间、命令和变量(Tcl没有真正的全局变量;所有内容都是特定解释器上下文的本地内容)。这种删除反过来又会将内存释放回主内存管理器,可能还会释放回操作系统;这就是调用
free()
的原因;在某些配置中可能会间接调用它,但它将被调用。(如果解释器上下文中有一个活动执行,即调用
Tcl_Eval()
或它的一个相关函数,那么一些删除操作将被推迟到执行完成。)也有一些回调(嗯,很多回调)可以设置为检测各种删除操作;这些也可以(而且很可能会)释放东西


我不知道是什么导致了挂起,但据猜测,似乎有另一个线程正在敲打系统内存分配器,将内存分配器的全局锁保持得太紧。如果是这样的话,那就太糟糕了。在这种情况下,您最好尝试升级到支持线程的Tcl 8.5或8.6版本(无论如何,我建议您升级;8.4现在已经没有非商业支持了),因为它使用的是一个自定义内存分配器,几乎不经常从全局内存池分配(和取消分配)内存。我不知道这会解决问题;我怀疑这个bug不在Tcl的实现中,而是在其他代码中。(除非你有一些奇特的扩展代码,否则它肯定不会出现在Tcl脚本中。)

谢谢你的回答Donal