0

由于 Tcl 使用单元线程模型作为其基本的多线程框架,每个 tcl 解释器 obj 都绑定到创建它的线程。在我的程序中,每个线程在第一次需要调用任何 tcl 命令时调用 Tcl_CreateInterp 来创建自己的解释器。但是问答测试报告说,当线程打算创建自己的解释器时,valgrind (v3.13.0) 抱怨可能存在数据竞争问题。数据竞争发生在 apis Tcl_NewStringObj/TEBCresume/TclNREvalObjv 等。我的使用模型有什么要纠正的吗?还是valgrind的误报?

我使用 boost::thread_specific_ptr 来管理线程本地解释器。

Tcl_Interp* GetThreadInterp()
{
   static boost::thread_specific_ptr < Tcl_Interp >  tcl_interp;
   if (!tcl_interp.get())
       tcl_interp.reset(Tcl_CreateInterp());
   return tcl_interp.get();
}
4

0 回答 0