Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Perl-多线程脚本打印内存映射和回溯_Multithreading_Perl_Memory Management_Scripting_Threadpool - Fatal编程技术网

Multithreading Perl-多线程脚本打印内存映射和回溯

Multithreading Perl-多线程脚本打印内存映射和回溯,multithreading,perl,memory-management,scripting,threadpool,Multithreading,Perl,Memory Management,Scripting,Threadpool,当我调用我的多线程perl脚本时,在一些情况下,它会引发一些类似以下的异常。很抱歉,我无法共享代码。但如果真的需要,我可以尝试构建一个片段(如果真的需要)。因为我想这应该有一些理论上的答案 *** glibc detected *** perl: double free or corruption (!prev): 0x00007f775401e9a0 *** ======= Backtrace: ========= /lib64/libc.so.6[0x3d74c75e66] /lib64/l

当我调用我的多线程perl脚本时,在一些情况下,它会引发一些类似以下的异常。很抱歉,我无法共享代码。但如果真的需要,我可以尝试构建一个片段(如果真的需要)。因为我想这应该有一些理论上的答案

*** glibc detected *** perl: double free or corruption (!prev): 0x00007f775401e9a0 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3d74c75e66]
/lib64/libc.so.6[0x3d74c789b3]
/lib64/libc.so.6[0x3d74c7b880]
/lib64/libc.so.6(realloc+0xe5)[0x3d74c7baf5]
/usr/lib/../lib64/libcrypto.so.10(CRYPTO_realloc+0x5f)[0x7f775907bd8f]
/usr/lib/../lib64/libcrypto.so.10(lh_insert+0xee)[0x7f77590f763e]
/usr/lib/../lib64/libcrypto.so.10(OBJ_NAME_add+0x6b)[0x7f775907f12b]
/usr/lib/../lib64/libcrypto.so.10(EVP_add_cipher+0x27)[0x7f7759102387]
/usr/lib/../lib64/libcrypto.so.10(OpenSSL_add_all_ciphers+0x4b7)[0x7f7759106a07]
/usr/lib/../lib64/libcrypto.so.10(OPENSSL_add_all_algorithms_noconf+0xe)[0x7f775910653e]
/usr/local/lib/libssh2.so.1(libssh2_init+0x39)[0x7f77596800b9]
为什么我会犯这样的错误

我正在使用usethread::Queue;使用线程::共享;请让我知道你的看法

下面是线程库的版本信息

use threads; - installed v2.15 (latest - 2.16)
use Thread::Queue; - installed v3.12 (up to date)
use threads::shared; - installed v1.56 (latest - 1.57)
perl - installed v5.26.1
其他图书馆包括:

use YAML::XS 'LoadFile';  - 0.66 up to date
use Net::Netconf::Manager; - 1.02 up to date
use Config::Properties; - 1.80 up to date
use Sys::Syslog; - 0.35 up to date
use DateTime::Format::Strptime; - 1.74 up to date
use DateTime; - 1.44 up to date
use XML::LibXML; - 2.0129 (latest 2.0139)
use Regexp::Common qw/net/; - 2017060201 up to date
use Getopt::Long; - 2.5 up to date

为了给你一个明确的答案,我们需要一些我们可以运行和故障排除的东西。否则,误差是不可再现的

话虽如此,这看起来与我以前遇到的某些模块不是线程安全的类似,它们通常运行良好,然后偶尔会在您面前爆炸

例如,2008年。在1.4.2之前

一般的解决方法是在编译时停止使用
use
加载罪魁祸首,因为所有线程都继承了相同的状态,而在线程内部,在运行时使用
require
import
加载罪魁祸首。通过这样做,您正在隔离它们——您的线程将需要稍长的时间启动,但无论如何,您不应该在perl中滥发线程

或者使用线程安全的其他模块

随着您的更新和屏幕截图-
Net::SSH2
,这意味着您的另一个模块正在使用它

但是,表示可能对线程安全有一些限制:

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

您没有明确提到使用它,但它看起来像是被另一个模块引入。猜测一下,这将是
Net::Netconf::Manager

作为第二个进一步的猜测,它很可能在做“共享句柄”,因为它没有意识到它正在线程中运行

因此,我建议在线程内隔离此模块:

require 'Net::NetConf::Manager';
Net::NetConf::Manager -> import; 
并在线程内进行实例化

当您使用工作线程模型时,这应该是最小的开销,这意味着您没有遇到这个问题


但更一般地说,假设模块是线程安全的是不明智的,除非它们明确表示它们是线程安全的。主要的“绊倒”点通常是当模块可以假定/暗示任何类型的资源共享时,例如网络套接字、文件句柄、数据库连接等。通常在实例化时创建套接字(例如,传递用户名/密码的点)同时有两个线程试图驱动一个套接字是一种潜在的争用条件

为了给你一个明确的答案,我们需要一些可以运行和排除故障的东西。否则,误差是不可再现的

话虽如此,这看起来与我以前遇到的某些模块不是线程安全的类似,它们通常运行良好,然后偶尔会在您面前爆炸

例如,2008年。在1.4.2之前

一般的解决方法是在编译时停止使用
use
加载罪魁祸首,因为所有线程都继承了相同的状态,而在线程内部,在运行时使用
require
import
加载罪魁祸首。通过这样做,您正在隔离它们——您的线程将需要稍长的时间启动,但无论如何,您不应该在perl中滥发线程

或者使用线程安全的其他模块

随着您的更新和屏幕截图-
Net::SSH2
,这意味着您的另一个模块正在使用它

但是,表示可能对线程安全有一些限制:

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

您没有明确提到使用它,但它看起来像是被另一个模块引入。猜测一下,这将是
Net::Netconf::Manager

作为第二个进一步的猜测,它很可能在做“共享句柄”,因为它没有意识到它正在线程中运行

因此,我建议在线程内隔离此模块:

require 'Net::NetConf::Manager';
Net::NetConf::Manager -> import; 
并在线程内进行实例化

当您使用工作线程模型时,这应该是最小的开销,这意味着您没有遇到这个问题


但更一般地说,假设模块是线程安全的是不明智的,除非它们明确表示它们是线程安全的。主要的“绊倒”点通常是当模块可以假定/暗示任何类型的资源共享时,例如网络套接字、文件句柄、数据库连接等。通常在实例化时创建套接字(例如,传递用户名/密码的点)同时有两个线程试图驱动一个套接字是一种潜在的争用条件

我们至少需要知道您正在使用哪些其他库(版本和perl版本)。但是如果没有一段可复制的代码,我们无法可靠地回答。您的屏幕截图提到了
Net::SSH2
:我们至少需要知道您正在使用哪些其他库(版本和perl版本)。但是如果没有一段可复制的代码,我们无法可靠地回答。您的屏幕截图提到
Net::SSH2
:谢谢。我已经将我正在使用的所有软件包及其版本信息添加到我的问题中。我没有使用你在回答中提到的任何软件包。你是对的,这个错误偶尔会爆发。我真的很担心是什么导致了这个问题!你能总结出什么吗?从模块列表中,少于错误的屏幕截图,表明你遇到问题的是
libssh
。而
Net::Netconf::Manager
Net::SSH2
作为
Net::Netconf::Access::ssh
的一部分,这是关于线程安全的文档说明。(任何未提及线程安全的模块都不明智地假设