Perl Net :: SSH2,线程崩溃

时间:2015-01-14 22:30:36

标签: multithreading perl ssh

我有一个如下代码。我的问题是随机崩溃,出现以下错误:

perl: ath.c:193: _gcry_ath_mutex_lock: Assertion `*lock == ((ath_mutex_t) 0)' failed.

如果我运行代码10次就会崩溃2-3次。如何解决?

use warnings;
use strict;
use Net::SSH2;
use threads;

sub gsmExec {
    $host = $_[0];
    $port = $_[1];
    $user = $_[2];
    $pass = $_[3];
    my $modem = Net::SSH2->new();
    print "Trying to connect host $host : $port \n";
    if($modem->connect($host,$port)) {
        print "connected to host ..\n";

        if ($modem->auth_password($user,$password) {
            print "Authorized!!";
        }
    }
}

for(my $j = 1; $j <= $modemCount; $j++){
        $thrList[$j] = threads->create(\&gsmExec,'host',22,'user','pass');
}

1 个答案:

答案 0 :(得分:2)

那里不是perl错误 - 这是Net::SSH库中的一些C代码。

有迹象表明,您不是唯一一个遇到此问题的人:

http://www.perlmonks.org/?node_id=936201

http://lists.gnupg.org/pipermail/gcrypt-devel/2006-January/000910.html

看起来GnuTLS中可能存在一个错误,这使得它不是线程安全的。 解决方法是:

  • 单线程&#39; TLS&#39;位。
  • 使用fork代替线程。 (Parallel::ForkManager对此非常好)。
  • Net::OpenSSH::Parallel也可以做到这一点。