У каждого потока есть свой интерпретатор. Эта структура [1] хранит все, что составляет perl
, включая состояние синтаксического анализатора, состояние обработчика регулярных выражений, таблицу символов и все "SV
" (включая скаляры, массивы, хэши, код и т. Д.). ). Создание нового потока из копий Perl создает копию текущего интерпретатора.
Код XS может безопасно использовать Perl API, потому что у каждой функции есть параметр, который определяет интерпретатор для использования. Это часто невидимо для кода благодаря макросам, но вы могли заметить ссылки на «THX
» или «контекст Perl». Только не передавайте SV, который принадлежит одному переводчику другому. (Возможно, вы слышали об ошибке «Свободный в неправильный пул», которая может появиться в результате.)
Но Perl не может предложить никакой защиты вещам, находящимся вне его знаний или контроля, таких как статическое хранилище внешних библиотек, которые он загружает. Их копии не сделаны. Два потока могут вызывать одну и ту же функцию C одновременно, поэтому необходимо соблюдать меры предосторожности, как если бы вы писали многопоточную программу на C.
Эта структура макроса, на которую ссылается ваша цитата, дает доступ к хранилищу для каждого переводчика. Это также позволяет библиотеке указывать функцию для вызова при создании новых потоков Perl для клонирования переменных в новый интерпретатор.
- Если Perl создается без
-Dusemultiplicity
, интерпретатор Perl вместо этого состоит из глобальных (статических) переменных bajillion. MULTIPLICITY
перемещает их в структуру и добавляет параметр контекста к вызовам API Perl. Это снижает производительность, но позволяет процессу иметь несколько интерпретаторов Perl. Поскольку для многопоточных сборок Perl требуется это, сборка многопоточных perl
(-Dusethreads
) предполагает -Dusemultiplicity
.