【问题标题】:tcl interpreter parameters contaminatedtcl 解释器参数被污染
【发布时间】:2019-04-18 09:14:57
【问题描述】:

我有一个多线程 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 segmentation-fault


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 2016-10-17
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      相关资源
      最近更新 更多