亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3304 | 回復: 7
打印 上一主題 下一主題

perl muti-threading里傳全局變量hash reference [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-08-29 08:36 |只看該作者 |倒序瀏覽
本帖最后由 turningA 于 2014-08-30 09:49 編輯

各位好!首次發(fā)帖。多多指教!
請教一個關(guān)于multithreading里傳遞參數(shù)的問題。

當我不用multithreading的時候,以下是work的。
Version 1:

  1. my %readMap1;
  2. parseInputFile(\%readMap1,$inFileName1,$end1);
  3. my %readMap2;
  4. parseInputFile(\%readMap2,$inFileName2,$end2);

  5. sub parseInputFile
  6. {
  7.                   my ($readMapRef, $file, $anchor) = @_;
  8.                 ...
  9. }
復制代碼
當我用multithreading的時候,以下是不work的。
Version 2:

  1. my %readMap1;
  2. my @Threadsinput=();
  3. my $trd= threads -> new ( sub {parseInputFile(\%readMap1,$inFileName1,$end1)} );
  4. push (@Threadsinput, $trd);
  5. my %readMap2;
  6. my $trd= threads -> new ( sub {parseInputFile(\%readMap2,$inFileName2,$end2)} );
  7. push (@Threadsinput, $trd);
  8. foreach my $thr (@Threadsinput)
  9. {
  10.         print $thr->tid, " threadID\n";
  11.         $thr->join;
  12. }
  13. sub parseInputFile
  14. {
  15.                   my ($readMapRef, $file, $anchor) = @_;
  16.                 ...
  17. }
復制代碼
單步調(diào)試顯示join后兩個hashes 都是空的。

于是我換了一個思路:通過子程序返回值把hash返回,以下是work的,。
version 3:

  1. my %readMap1;
  2. my @Threadsinput=();
  3. my $trd= threads -> new ( sub {parseInputFile($inFileName1,$end1)} );
  4. push (@Threadsinput, $trd);
  5. my %readMap2;
  6. my $trd= threads -> new ( sub {parseInputFile($inFileName2,$end2)} );
  7. push (@Threadsinput, $trd);
  8. my @mapArr=();
  9. foreach my $thr (@Threadsinput)
  10. {
  11.         my $mapHashRef=$thr->join;
  12.         push @mapArr, \%{$mapHashRef};
  13. }

  14. sub parseInputFile
  15. {
  16.                   my ( $file, $anchor) = @_;
  17.                 my %readMapRef=();
  18.                 ...
  19.                 ##in this subroutine, I will write something into this hash: %readMapRef
  20.                 [b]return \%readMapRef;[/b]

  21. }
復制代碼
我的問題是: 為什么把全局變量hash以引用的方式傳入子函數(shù),并把子程序multithreading,不work呢?



論壇徽章:
1
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-10-07 06:20:00
2 [報告]
發(fā)表于 2014-08-29 12:23 |只看該作者
哈哈哈,歡迎turningA...

我拉了一個Bioinfo的來Perl版!

論壇徽章:
0
3 [報告]
發(fā)表于 2014-08-30 09:33 來自手機 |只看該作者
perl的多線程模型默認數(shù)據(jù)是不共享的,threads::shared

論壇徽章:
0
4 [報告]
發(fā)表于 2014-08-30 09:44 |只看該作者
本帖最后由 turningA 于 2014-08-30 09:51 編輯

回復 3# sjdy521

因為速度的考慮,我避免了在多線程里共享數(shù)據(jù)。
我定義了兩個不同的hash,也就是兩個線程分別往不同的hash里寫數(shù)據(jù)。


   

論壇徽章:
0
5 [報告]
發(fā)表于 2014-08-30 17:07 來自手機 |只看該作者
這樣速度也一樣上不去 不要共享就追求速度 你可以改成perl多進程方式了

論壇徽章:
0
6 [報告]
發(fā)表于 2014-08-30 22:05 |只看該作者
回復 5# sjdy521

哦?請展開講講?多進程是說的是fork么?

我的原意是lock free的多線程可在速度上稍稍提高些,避免了大家共同訪問同一個引用而需要等待的時間。
   

論壇徽章:
0
7 [報告]
發(fā)表于 2014-08-30 22:20 |只看該作者
回復 6# turningA


    避免cow可以一定程度提升速度,但perl的多線程本身就性能不行,你根本不需要多線程共享的話。就直接用多進程就可以了,多進程是指fork

論壇徽章:
0
8 [報告]
發(fā)表于 2014-08-30 23:28 |只看該作者
回復 2# chenhao392


    :wink:
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP