Интерпретировать команды Tcl в разных потоках - PullRequest
0 голосов
/ 13 марта 2020

В моем проекте у меня есть основной Tcl_Interp объект с множеством различных пользовательских команд, и я хочу вызвать Tcl_Eval для интерпретации команд в нескольких потоках C ++. Поскольку каждый Tcl_Interp присоединен к своему потоку, невозможно использовать основной интерпретатор из других потоков, а созданные мной с помощью Tcl_CreateInterp интерпретаторы могут выполнять только команды Tcl по умолчанию, но не мои пользовательские команды.

Так есть ли способ создать копию основного интерпретатора для каждого потока?

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Если вы используете Tcl_AppInitProc для создания своих пользовательских команд, то только выполняется в главном потоке. Другие темы по умолчанию являются ванильными. Чтобы исправить это, нужно зарегистрировать пакет stati c во время выполнения Tcl_AppInitProc, который затем вы можете load специально в каждом потоке (при его создании), чтобы получить ваши собственные команды , (Вы бы лучше написали свои команды, чтобы быть потокобезопасными или привязанными к интерпретатору / независимостью от потоков c, но это ваша проблема.)

В частности:

int Tcl_AppInit(Tcl_Interp *interp) {
    // Name is arbitrary, but needs to match [load] call in Tcl
    Tcl_StaticPackage(interp, "myCustom", MyCustomPerThreadInit, NULL);
    // Other main thread initialisation here
    return TCL_OK;
}
int MyCustomPerThreadInit(Tcl_Interp *interp) {
    // Register your worker thread commands here
    return TCL_OK;
}

А затем в каждом потоке вы сначала делаете это:

load {} myCustom

Вы должны будете помнить, чтобы делать это и в вашем основном потоке, если вы хотите, чтобы эти команды были там. Или вы можете разделить свои команды на команды для основного потока и команды для рабочих. Ваш выбор.

0 голосов
/ 14 марта 2020

Так есть ли способ создать копию основного интерпретатора для каждого потока?

Способ на уровне сценария состоит в предоставлении сериализатора . Использование превосходного самоанализа Tcl (info commands et c.), Чтобы превратить текущее состояние интерполяции в канонический скрипт, который затем получен в другом интерпретаторе, созданном с использованием Tcl_CreateInterp.

NaviServer вызывает этот чертеж и предоставляет сценариальный сериализатор в качестве отправной точки. Следите за nstrace::statescript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...