2014-10-28 50 views
5

如何跨主線程和工作線程共享哈希引用$ref如何在multithread perl中共享散列引用?

#!/usr/bin/perl 
use strict; 
use warnings; 

use threads; 
use threads::shared; 

my $ref = {}; 
$ref->{0}->{abc} = 123; 
$ref->{1}->{abc} = 223; 

printf("%d\n", $ref->{0}->{abc}); 
printf("%d\n", $ref->{1}->{abc}); 

issue_all_jobs($ref); 

while (1) 
{ 
    printf("%d\n", $ref->{0}->{abc}); 
    printf("%d\n", $ref->{1}->{abc}); 
    sleep(1); 
} 

sub issue_all_jobs 
{ 
    my ($ref) = @_; 
    for (my $i = 0; $i < 2; $i++) 
    { 
     $ref->{$i}->{handle} = new threads(\&issue_job, $ref, $i); 
     $ref->{$i}->{handle}->detach(); 
    } 
} 

sub issue_job 
{ 
    my ($ref, $i) = @_; 
    $ref->{$i}->{abc} = 555123 + $i; 
    sleep(2); 
} 

回答

5

這不符合您的想象。 threads::shared的侷限之一在於它可以很好地共享單個容器,但是當試圖嵌套數據結構時,它會變得相當混亂,因爲編譯器不知道它需要共享什麼。

http://perldoc.perl.org/threads/shared.html#BUGS-AND-LIMITATIONS

所以 - 對於初學者 - 你需要在首位共享指定的共享變量。無論是在宣告:

my $ref : shared; 

但是當你想分享的哈希

shared_clone ($ref); 

但我個人 - 我會迴避這樣的事情了。我不喜歡使用共享內存對象,並且通常更喜歡使用Thread::SemaphoreThread::Queue,並將數據在隊列中來回傳遞。 Storable對此有很大的幫助,因爲您可以將freezethaw數據對象插入到隊列中。

+0

感謝您繼續爲您提供線程專業知識。我感謝你的貢獻。 – Miller 2014-10-28 21:27:30

+3

我開始學習線程/分叉的主要原因 - 就此而言,OO - 是因爲它讓所有我認識的人都知道,當我提出這個問題時,如何'perl低於'看起來有點不舒服。 – Sobrique 2014-10-29 07:31:14