tcl解释器参数受污染

问题描述 投票:0回答:1

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

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

multithreading tcl sigsegv
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.