3

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

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

在谷歌上搜索后,我在 tcl 线程模型文档中找到了这个: http ://www.tcl.tk/doc/howto/thread_model.html

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

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

4

1 回答 1

3

我为每个线程创建一个 tcl interp,并将其用于Tcl_EvalEx脚本,并通过 获取结果Tcl_GetStringResult,这个线程安全吗?

是的。Tcl 的引擎广泛使用特定于线程的数据,因此在线程之间传输解释器是不可能的[*](事情会严重破坏),但同时保证线程安全是有好处的。要记住的主要事情是在与 Tcl 的实现混合时使用 Tcl 的内置内存分配器函数,而不是尝试自己做,因为线程 Tcl 使用的关键事物之一是线程感知内存分配器(快得多,因为大多数数据都绑定到单个线程)。

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


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

于 2013-08-15T19:17:07.010 回答