Multithreading Perl线程安全模块

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

我正在尝试使用我编写的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 => "\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”魔法,它就可以正常工作了。

    这是你的错


  • 试着找出导致分段错误的最小程序。这节省了我寻找分段错误原因的几个小时。谢谢