Вообще говоря, модули ядра и высокой видимости являются поточно-ориентированными, если в их документации не указано иное.
Тем не менее, в вашем посте есть несколько ошибок:1006 *
share($CSV)
Это очищает $CSV
(благословенный хэшреф), так же, как описано в threads
.Как правило, вы хотите совместно использовать () сложные объекты до до инициализации или, возможно, в этом случае, совместно использовать () некоторую немую переменную $lock
между потоками.Поскольку $CSV
содержит состояние для базового XS, это может привести к неопределенному поведению. Но это не ваша ошибка.
threads->create(\&sayHello('1'));
Вы ошибочно вызываете sayHello(1)
в главном потоке и передаете ссылку на его возвращаемое значение на threads->create()
в качестве (поддельной) процедуры запуска.Вы хотели сказать:
threads->create(\&sayHello, '1');
Но это не ваша ошибка.
( РЕДАКТИРОВАТЬ Просто уточнить - плохое началоподпрограмма здесь не рискует SEGV в любом случае. threads::create
правильно жалуется, если передано нераспознанное имя подпрограммы или ссылка не-CODE. В вашем случае, однако, вы слишком быстро сегрегируете, чтобы достичь этой обработки ошибок.)
Кодировки не являются поточно-ориентированными.Снова , как описано в encodings
, модуль encoding
не является поточно-ориентированным.Вот наименьший возможный код, который я мог бы воспроизвести для ваших симптомов:
use threads;
open my $OUTPUT , ">:encoding(utf8)", "/dev/null" or die $!;
threads->create( sub {} )->join;
Это perl 5.12.1 с threads-1.77 на i686-linux-thread-multi, если вам интересно.Отбросьте магию «utf8», и она отлично работает.
Это ваша ошибка