Tcl:扩展加载和线程的交互

时间:2012-03-07 08:04:18

标签: package loading tcl

可以执行Tcl_PackageInitProc()的多个实例 如果配置了TCL,则同时(在不同的线程中) 对于线程?

出于向后兼容的原因,我相信 必须调用初始化和卸载程序 序列

本手册对行为保持沉默:调用这些例程 序列化的,或必须扩展的编写者处理同步,在 特殊的互斥,在这些例程中?

1 个答案:

答案 0 :(得分: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;
}