TCL 解释器参数被污染



我有一个多线程C++程序,其中主线程创建两个 tcl 解释器,interp#1 和 interp#2。在并行运行期间,主线程和一个从线程分别尝试通过 interp#1 和 interp#2 调用不同的 cmd。在某些时候,会发生内存错误并且程序崩溃。 日志文件告诉我,对于 interp#1 的 kObjv[] 的某些值被 interp#2 的值污染了。 我还运行 helgrind 来检查可能的数据竞争,它会在 tcl lib API 下转储大量数据竞争风险,例如:Tcl_NewStringObj/TclFreeObj/ResetObjResult/TclNREvalObjv 等。

看起来底层内存由来自同一线程的解释器共享。这是真的吗?我的程序链接静态 tcl 8.6 库,该库是在启用线程的情况下安装的。

Tcl 库使用线程绑定内存池来(极大地!)减少全局锁的压力,结果是每个 Tcl 解释器对象也与创建它的线程紧密绑定。(如果您熟悉的话,这是公寓线程模型。您不能安全地使用来自任何其他线程的 Tcl 解释器。如果你想在每个线程中访问一个Tcl解释器,每个线程都应该创建自己的解释器并使用它。

有一些操作允许安全的线程间通信,特别是Tcl_ThreadQueueEvent()Tcl_ThreadAlert(),它们允许您在准备好时提交消息供其他线程处理(每个带有 Tcl 解释器的线程在 Tcl 库中都有一个与之关联的事件队列;这是 Tcl 事件通知程序引擎的核心)。

建议你使用 Tcl 线程包(它应该是任何好的 Tcl 8.6 安装的一部分,也适用于旧版本)在 Tcl 中进行线程间工作。 除了让每一方都知道另一方线程的句柄是什么的复杂性之外,它真的很容易使用。

相关内容

  • 没有找到相关文章

最新更新