我正在用 perl 编写多线程脚本。我在其中使用了一个库 Net::Netconf::Manager
,它又使用了 Net::SSH2
。当同时“共享句柄”时,此 Net::SSH2(libssh2) 似乎不是线程安全的。
我在 libssh2 website 中引用
线程安全:只是不要同时共享句柄
- 我不确定这个“共享句柄”是什么意思。我也想知道如何“不共享句柄”。
当我运行我的脚本时,偶尔我会看到带有回溯和内存映射的错误跟踪,表示 *** glibc detected *** perl: double free or corruption (out): 0x00007f0320012d70 ***
错误.这个错误是因为 Net::SSh2 库的线程安全性。
- 如何使这个 Net::Netconf::Manager 对每个线程都可用,而不是用 '
use
' 全局声明它。我希望所有线程都可以独立于其他线程访问该库。
请让我知道您的看法。
最佳答案
我是 Net::SSH2
的当前维护者。
我从未追求该模块的线程安全性,但对其代码的粗略检查表明,双重释放错误可能是由 Net::SSH2
对象的 Perl 端引起的在线程创建时克隆,而 C 端不是。这会导致 libssh2
对象被销毁并释放两次,从而导致程序崩溃。
因此,如果您想在多线程应用程序中使用 Net::SSH2
,您应该确保永远不会从存在该模块对象的线程创建线程。
即便如此,模块中也可能潜伏着其他错误。
显然,正确的做法是修复模块。如果你想自己做,我会尽力帮助你。请与我联系,以便我们可以先讨论细节......否则,既然你已将这个问题提请我注意,好吧,也许在某个时候我会自己解决它......但这不会一夜之间发生。
关于multithreading - Perl - 如何制作特定于各个线程的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47092975/