Tcl: взаимодействие загрузки расширений и потоков - PullRequest
3 голосов
/ 07 марта 2012

Может ли выполняться несколько экземпляров Tcl_PackageInitProc () одновременно (в разных потоках), если TCL был настроен для темы?

По причинам обратной совместимости, я считаю, вызовы процедур инициализации и выгрузки должны быть сериализованная.

В руководстве ничего не говорится о поведении: вызовы этих подпрограмм Сериализованные или должны расширять авторы имеют дело с синхронизацией, в конкретное взаимное исключение, в этих подпрограммах?

1 Ответ

1 голос
/ 08 марта 2012

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;
}
...