Perl - 跨线程的数组哈希

时间:2014-01-27 07:49:13

标签: multithreading perl hash multidimensional-array

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

我收到以下错误: 线程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]);
  }
 }
} 

1 个答案:

答案 0 :(得分: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] );
      }
    }

  }
}