multithreading - Perl - 如何制作特定于各个线程的库

标签 multithreading perl ssh libssh2 ietf-netconf

我正在用 perl 编写多线程脚本。我在其中使用了一个库 Net::Netconf::Manager,它又使用了 Net::SSH2。当同时“共享句柄”时,此 Net::SSH2(libssh2) 似乎不是线程安全的。

我在 libssh2 website 中引用

线程安全:只是不要同时共享句柄

  1. 我不确定这个“共享句柄”是什么意思。我也想知道如何“不共享句柄”。

当我运行我的脚本时,偶尔我会看到带有回溯和内存映射的错误跟踪,表示 *** glibc detected *** perl: double free or corruption (out): 0x00007f0320012d70 *** 错误.这个错误是因为 Net::SSh2 库的线程安全性。

  1. 如何使这个 Net::Netconf::Manager 对每个线程都可用,而不是用 'use' 全局声明它。我希望所有线程都可以独立于其他线程访问该库。

请让我知道您的看法。

最佳答案

我是 Net::SSH2 的当前维护者。

我从未追求该模块的线程安全性,但对其代码的粗略检查表明,双重释放错误可能是由 Net::SSH2 对象的 Perl 端引起的在线程创建时克隆,而 C 端不是。这会导致 libssh2 对象被销毁并释放两次,从而导致程序崩溃。

因此,如果您想在多线程应用程序中使用 Net::SSH2,您应该确保永远不会从存在该模块对象的线程创建线程。

即便如此,模块中也可能潜伏着其他错误。

显然,正确的做法是修复模块。如果你想自己做,我会尽力帮助你。请与我联系,以便我们可以先讨论细节......否则,既然你已将这个问题提请我注意,好吧,也许在某个时候我会自己解决它......但这不会一夜之间发生。

关于multithreading - Perl - 如何制作特定于各个线程的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47092975/

相关文章:

java - 如何在spring Mvc中使用多线程提高性能

perl - 如何使用 GetOptions 实用程序处理 Perl 中的 'optional' 命令行参数?

multithreading - Perl Net::SSH2 线程崩溃

wpf - WPF UI线程

c - 调用 pthread_cond_signal(...) 然后调用 pthread_cond_wait(...) 会唤醒服务员吗?

linux - 从文件中随机选择 n 行并可能重复

linux - 通过与第一列进行比较,从文本文件的行中删除所有重复的单词

linux - 无法终止由 bash 脚本中的另一个 ssh session 启动的进程

linux - 如何使用 ssh 在 Linux 主机服务器上安装 Elastic Search

Java线程在没有通知的情况下死亡