0

Tcl はその基本的なマルチスレッド フレームとしてアパートメント スレッド モデルを使用するため、すべての tcl インタープリター obj はそれを作成するスレッドにバインドされます。私のプログラムでは、各スレッドは、最初に Tcl コマンドを呼び出す必要があるときに、Tcl_CreateInterp を呼び出して独自のインタープリターを作成します。しかし、Q&A テストでは、valgrind (v3.13.0) は、スレッドが独自のインタープリターを作成しようとするとデータ競合の問題が発生する可能性があると報告しています。データ競合は API 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