Вызов Tcl proc в многопоточном режиме - PullRequest
0 голосов
/ 25 сентября 2019

Моя функция func() вызывается несколькими потоками.(Каждый поток вызовет эту функцию только один раз.)

Внутри func() я хочу, чтобы каждый поток вызывал процесс Tcl с именем tcl_proc_name (который не принимает аргументов).

Для этого мне понравилось вот что:

Tcl_Eval (Tcl_CreateInterp (), "tcl_proc_name");

Но почему-то этот код не может вызвать процесс Tcl.

Я что-то упустил?

1 Ответ

0 голосов
/ 25 сентября 2019

Каждый интерпретатор Tcl (т. Е. Каждый экземпляр Tcl_Interp) строго связан дизайном с потоком, который его создает;реализация внутренне использует данные, относящиеся к конкретным потокам, чтобы практически полностью исключить необходимость в серьезных блокировках (таких как глобальная блокировка интерпретатора, которая наносит ущерб производительному многопоточному коду Python).Команды Tcl полностью связаны с интерпретатором, который их содержит.Вы должны:

  1. Отправить сообщение в один поток для выполнения действия.(См. Функцию Tcl_QueueEvent() или используйте команду thread::send пакета Thread с уровня Tcl.)
  2. Дублируйте команду в нескольких интерпретаторах, по одному на поток.Это может быть легко или сложно в вашем приложении.

Во избежание всех сомнений: вы не можете безопасно использовать интерпретатор Tcl из нескольких потоков.Это не будет работать;гарантировано. Это приведет к сбоям.

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