Perl Net::SSH2 线程崩溃
Perl Net::SSH2 with thread crashing
我有如下代码。我的问题是它随机崩溃并出现以下错误:
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');
}
这并不是真正的 perl
错误 - 那是 Net::SSH
库中的一些 C 代码。
有一些迹象表明您不是唯一遇到此问题的人:
http://www.perlmonks.org/?node_id=936201
http://lists.gnupg.org/pipermail/gcrypt-devel/2006-January/000910.html
看来 GnuTLS 中可能存在错误,这使得它不是线程安全的。
解决方法是:
- 单线程'TLS'位。
- 使用
fork
而不是线程。 (Parallel::ForkManager
对此非常有用)。
Net::OpenSSH::Parallel
也可以解决问题。
我有如下代码。我的问题是它随机崩溃并出现以下错误:
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');
}
这并不是真正的 perl
错误 - 那是 Net::SSH
库中的一些 C 代码。
有一些迹象表明您不是唯一遇到此问题的人:
http://www.perlmonks.org/?node_id=936201
http://lists.gnupg.org/pipermail/gcrypt-devel/2006-January/000910.html
看来 GnuTLS 中可能存在错误,这使得它不是线程安全的。 解决方法是:
- 单线程'TLS'位。
- 使用
fork
而不是线程。 (Parallel::ForkManager
对此非常有用)。 Net::OpenSSH::Parallel
也可以解决问题。