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();
}