如何在多线程perl中共享哈希引用?

Jea*_*ean 5 perl multithreading thread-safety

如何$ref跨主线程和工作线程共享哈希引用?

#!/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);
}
Run Code Online (Sandbox Code Playgroud)

Sob*_*que 5

这不像你想象的那样有效.其中一个限制threads::shared是它可以很好地共享单维容器,但是在尝试处理嵌套数据结构时它会变得相当混乱,因为编译器不知道它需要共享什么.

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

因此 - 对于初学者 - 您需要首先将共享变量指定为共享.要么声明:

my $ref : shared;
Run Code Online (Sandbox Code Playgroud)

但是当你试图分享哈希时

shared_clone ( $ref ); 
Run Code Online (Sandbox Code Playgroud)

但就个人而言 - 我会回避这些事情.我不喜欢使用共享内存对象,并且通常更喜欢使用Thread::SemaphoreThread::Queue在队列中来回传递数据.Storable尽可能地帮助你freezethaw一个数据对象插入队列.

  • 我开始学习线程/分叉的主要原因 - 就此而言,OO - 是因为它让我所知道的所有人都高高兴兴地说'perl是劣等'当我提出它时看起来有点不舒服. (3认同)