2012-03-07 8 views
3

TCLがスレッド用に に設定されている場合、Tcl_PackageInitProc()のいくつかのインスタンスを同時に実行することができますか(別のスレッドで) ?Tcl:拡張ロードとスレッドの相互作用

下位互換性の理由から、 の初期化とアンロード手順の呼び出しは にシリアル化されている必要があります。

マニュアルでは、行動に沈黙している。これらのルーチンの呼び出しは シリアライズされ、または必須の拡張作家は、これらのルーチンでは、 特に排他で、同期に対処していますか?

答えて

1

Tclはではありません。は、これらの関数がシリアル化された方法で呼び出されることを保証します。あなたのコードが気にするなら、適切なミューテックスを使用しなければなりません。 TclはCライブラリに移植可能なプリミティブを提供しています。これは次のように使います:

#include <tcl.h> 

// MUCH easier to have this as its own function 
static void OneTimeSetup(void) { 
    static int doneSetup; 
    TCL_DECLARE_MUTEX(myMutex); 

    Tcl_MutexLock(&myMutex); 
    if (!doneSetup) { 
     // Do critical once-only setup here 
     doneSetup = 1; 
    } 
    Tcl_MutexUnlock(&myMutex); 
} 

int My_Init(Tcl_Interp *interp) { 
    // Declare the API version we're using, e.g., for 8.5... 
    if (Tcl_InitStubs(interp, "8.5", 0) == NULL) 
     return TCL_ERROR; 

    // Call out to our setup code 
    OneTimeSetup(); 

    // Install Tcl commands/variables/... here 

    // Ready for action! 
    return TCL_OK; 
} 
関連する問題