我可以在线程之间共享数据吗?我有一个简单的代码,我无法跨线程共享数据
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
答案 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']);