Multithreading Perl线程安全模块
我正在尝试使用我编写的Perl程序并对其执行线程。问题是我读到一些模块不是“线程安全的”。如何知道模块是否是线程安全的?我四处寻找了一份清单,但找不到 为了测试我经常使用的一个模块(Text::csvxs),我尝试了以下代码:Multithreading Perl线程安全模块,multithreading,perl,module,Multithreading,Perl,Module,我正在尝试使用我编写的Perl程序并对其执行线程。问题是我读到一些模块不是“线程安全的”。如何知道模块是否是线程安全的?我四处寻找了一份清单,但找不到 为了测试我经常使用的一个模块(Text::csvxs),我尝试了以下代码: use strict; use warnings; use threads; use threads::shared; require Text::CSV_XS; my $CSV = Text::CSV_XS->new ({ binary => 1, eol
use strict;
use warnings;
use threads;
use threads::shared;
require Text::CSV_XS;
my $CSV = Text::CSV_XS->new ({ binary => 1, eol => "\n" }) or die("Cannot use CSV: ".Text::CSV->error_diag());
open my $OUTPUT , ">:encoding(utf8)", "test.csv" or die("test.csv: $!");
share($CSV);
my $thr1 = threads->create(\&sayHello('1'));
my $thr2 = threads->create(\&sayHello('2'));
my $thr3 = threads->create(\&sayHello('3'));
sub sayHello
{
my($num) = @_;
print("Hello thread number: $num\n");
my @row = ($num);
lock($CSV);{
$CSV->print($OUTPUT, \@row);
$OUTPUT->autoflush(1);
}#lock
}#sayHello
我收到的输出如下:
Hello thread number: 1
Segmentation fault
你好,线程号:1
分段故障
这是否意味着模块不是线程安全的,还是另一个问题
谢谢一般来说,核心模块和高可见性模块是线程安全的,除非它们的文档中另有说明 也就是说,你的帖子中有一些失误:
共享($CSV)
这将清除
$CSV
(受祝福的hashref)。通常,您希望在初始化之前共享()复杂对象,或者在本例中,在线程之间共享()一些dumb$lock
变量。由于
$CSV
持有基础XS的状态,这可能导致未定义的行为。但这不是你的错
threads->create(\&sayHello('1'))代码>
您错误地调用了主线程中的sayHello(1)
,并将其返回值的引用作为(伪)启动例程传递给threads->create()
。
你的意思是说:
threads->create(\&sayHello, '1');
但这不是你的错
(EDIT只是澄清一下——在任何情况下,错误的启动例程都不会有SEGV的风险。threads::create
如果传入了无法识别的子例程名称或非代码引用,则会正确地进行投诉。但是,在您的情况下,您的segfaulting太快,无法进行此错误处理。)
同样,
编码
模块不是线程安全的。
这是我能得到的复制你症状的最小可能代码:
use threads;
open my $OUTPUT , ">:encoding(utf8)", "/dev/null" or die $!;
threads->create( sub {} )->join;
如果您感兴趣的话,这就是Perl5.12.1,它在i686Linux多线程系统上具有threads-1.77。放下“utf8”魔法,它就可以正常工作了。这是你的错
试着找出导致分段错误的最小程序。这节省了我寻找分段错误原因的几个小时。谢谢