tcl解释器参数被污染

时间:2019-04-18 09:14:57

标签: multithreading tcl sigsegv

我有一个多线程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库,该库是在启用线程的情况下安装的。

1 个答案:

答案 0 :(得分:1)

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

有一些操作可以安全地进行线程间通信,特别是Tcl_ThreadQueueEvent()Tcl_ThreadAlert(),它们可以让您向其他线程准备好消息后再发送一条消息(每个线程一个Tcl解释器在Tcl库中具有与其关联的事件队列;这是Tcl事件通知程序引擎的核心。)

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