在perl ithreads中共享数据

时间:2014-08-25 14:06:48

标签: multithreading perl

我可以在线程之间共享数据吗?我有一个简单的代码,我无法跨线程共享数据

use strict;
use LWP::UserAgent;
use threads;
use threads::shared;
my %threads_running :shared = ();
my %thread_data :shared = ();

$thread_data{1}=['a','b'];             #This line gives me an error

2 个答案:

答案 0 :(得分:1)

分配对共享变量的引用需要共享一个。你可以试试,

$thread_data{1} = threads::shared::shared_clone(['a','b']);

来自perldoc

  

shared_clone 接受引用,并返回其参数的共享版本,对任何非共享元素执行深层复制。参数中的任何共享元素都按原样使用(即,它们未被克隆)。

答案 1 :(得分:1)

$thread_data{1} = ['a','b'];  

相当于

my @anon = ('a','b');
$thread_data{1} = \@anon;

您正尝试将对非共享变量的引用存储到共享变量中。这没用 - 其他线程如何访问@anon? - 所以Perl给出了一个错误。

你想要

my @anon :shared = ('a','b');
$thread_data{1} = \@anon;

或者,如果您不介意制作数组副本,

$thread_data{1} = shared_clone(['a','b']);