簡體   English   中英

Perl-跨線程的哈希數組

[英]Perl - Hash of Arrays across Threads

我是Perl的初學者,但必須開發一些腳本來解析TCP轉儲。 在這里(我將其截斷並僅保留相關代碼):

我收到以下錯誤:線程1異常終止:TestThread1.pl第16行的共享標量的值無效,這是由於以下字符串:%input =(%input,$ fix_ClOrdID => [$ FrameTime_epoch,$ fix_MsgType]);

從許多類似的主題中,我了解到我無法使用thread :: 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]);
  }
 }
} 

在添加到哈希之前,請鎖定共享變量並克隆結構,

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] );
      }
    }

  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM