在单独的线程中创建的Tcl Interp会共享任何全局数据吗?

时间:2013-08-15 17:07:53

标签: multithreading tcl

在我的C ++代码中,如果我为每个线程创建一个tcl interp,并将其用于Tcl_EvalEx脚本,并通过Tcl_GetStringResult获取结果,这个线程是否安全?

除了const数据之外,这些线程之间没有共享数据。

在google上进行一些搜索之后,我在tcl线程模型doc中找到了这个: http://www.tcl.tk/doc/howto/thread_model.html

  

Tcl允许您在每个操作系统线程中拥有一个或多个Tcl解释器(例如,使用Tcl_CreateInterp()创建)。但是,每个解释器都与其OS线程紧密绑定,如果您让多个线程调用同一个解释器(例如,使用Tcl_Eval),则会发生错误。

我想这意味着如果我不在口译员之间共享数据,那么应该没有问题吗?

1 个答案:

答案 0 :(得分:3)

  

我为每个线程创建一个tcl interp,并使用它来Tcl_EvalEx一个脚本,并通过Tcl_GetStringResult得到结果,这个线程是否安全?

是。 Tcl的引擎广泛使用特定于线程的数据,因此在线程之间传输解释器是不可能的 [*] (事情可怕地破坏),但是你可以保证同时保证线程安全。要记住的主要事情是在与Tcl的实现混合时使用Tcl的内置内存分配器函数,而不是自己尝试,因为线程Tcl使用的关键之一是线程感知内存分配器( 更快。

简单的代码确实可以保持简单。很好,是吗?


[*] 好吧,如果你做一些非线程感知版本的技巧等等,这是可能的,但它真的很棘手,而且对于深度专家而言只是因为潜在的灾难性问题非常高Tcl的高度分区模型非常容易使用。