【问题标题】:Perl - Hash of Arrays across ThreadsPerl - 跨线程的数组哈希
【发布时间】:2014-02-17 23:21:55
【问题描述】:

我是 Perl 的初学者,但必须开发一些脚本来解析 TCP-dump。 在这里(我将其截断并仅留下相关代码):

我收到以下错误: 线程 1 异常终止:TestThread1.pl 第 16 行的共享标量值无效, 这是因为这个字符串: %input = (%input, $fix_ClOrdID => [$FrameTime_epoch,$fix_MsgType]);

从我读过的许多类似主题中,我了解到我无法使用 threads::shared 共享嵌套引用。而且我还找到了一些解决方法。但由于缺乏经验,我无法为我的案例应用示例。

您能否建议如何修复我的脚本以使其正常工作!

use threads;
use threads::shared;
my %input:shared = ();
threads->new(\&FixParser)->detach();

sub FixParser{  
 open(InFile, 'myFix.dmp') || die;
 while(InFile>){
  ($FrameTime_epoch,$fix_MsgType,$fix_ClOrdID) = split(';',);
  if(exists($input{$fix_ClOrdID})){
   $ExecDelay=$FrameTime_epoch-$input{$fix_ClOrdID}[0];
   print "MsgType: $input{$fix_ClOrdID}[1] ExecDelay: $ExecDelay us\n";
   delete($input{$fix_ClOrdID});
  }
  else{
   %input = (%input, $fix_ClOrdID => [$FrameTime_epoch,$fix_MsgType]);
  }
 }
} 

【问题讨论】:

  • 您是否从应用程序中复制/粘贴了实际代码?我不禁注意到您没有use strict; use warnings;,并且列出的代码无法编译。例如,我只是盯着它看,但这条线 while(InFile>) 应该是 while(<InFile>)。尝试添加use strict; use warnings; 并修复这些错误。如果仍有问题,您应该再次询问。

标签: multithreading perl hash multidimensional-array


【解决方案1】:

在添加到哈希之前锁定您的共享变量和克隆结构,

sub FixParser {  
  open(my $InFile, "<", 'myFix.dmp') || die $!;
  while(<$InFile>) {

    ADVISORY_LOCK: {
      lock(%input);
      # ..
      if(exists($input{$fix_ClOrdID})) {
        # ..
      }
      else{
       # %input = (%input, $fix_ClOrdID => [$FrameTime_epoch,$fix_MsgType]);
       $input{ $fix_ClOrdID } = threads::shared::shared_clone( [$FrameTime_epoch,$fix_MsgType] );
      }
    }

  }
}

【讨论】:

  • 非常感谢!!它似乎工作!但是这个 $input{ $fix_ClOrdID } = threads::shared::shared_clone( [$FrameTime_epoch,$fix_MsgType] );只是替换哈希的最后一个条目,但我需要将条目添加到 %input..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2020-07-19
  • 2017-02-24
  • 2014-05-12
  • 1970-01-01
  • 2012-08-22
相关资源
最近更新 更多