multithreading - Perl Net::SSH2 线程崩溃

标签 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');
}

最佳答案

这并不是真正的 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 也可以解决这个问题。

关于multithreading - Perl Net::SSH2 线程崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27953651/

相关文章:

python - 如何使 PySide.QtCore.QTimer.singleShot 调用其超时方法

spring - blockingqueue 和 Spring - 如何在启动时启动线程池?

linux - Perl/Linux 用另一个文件的内容过滤大文件

windows - 如何在 Windows 中修改 ~/.ssh 文件夹和文件?

linux - Amazon AWS EC2 使用 sudo rm -rf */意外删除了根目录。我怎样才能恢复它?

在多线程信号处理程序中调用 fflush?

c++ - 如何实现动态线程Boost::Barrier?

mysql - 将大量数据从 SQL Server 复制到 MySQL

java - Java 中具有非十六进制字符的等效 Perl 包 ("H*")

azure - 如何通过 SSH 连接到远程 PC 上运行的 Docker 容器?