Pma*_*oen 8 perl hash multithreading share multidimensional-array
我试图在多个线程上共享多维哈希.这个哈希包含2个连接的密钥对,我需要知道它们是否已经连接,如果不是,我需要连接它们,如果没有,就没有必要去数据库了.
use threads;
use threads::shared;
my %FLUobject2param : shared = ();
#Start a new thread for every available processor
for (my $i=0;$i<$PROCESSORS;$i++) {
threads->new(\&handlethread);
}
#Catch if these threads end
foreach my $onthr (threads->list()) {
$onthr->join();
}
sub handlethread{
...
if(not defined $FLUobject2param{$objectID}{$paramID}){
$dbh->getObject2Param($objectID,$paramID);
$FLUobject2param{$objectID}{$paramID} = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
我不断收到错误Invalid value for shared scalar就行了
if(not defined $FLUobject2param{$objectID}{$paramID}){
这显然与perl的线程:: shared共享只允许您共享单个级别的共享结构.
我怎样才能检查这个组合是否已用于多个线程?
大多数时候,Autovivification是你的朋友,但你必须小心使用共享值.修改handlethread:
sub handlethread{
# ...
unless (exists $FLUobject2param{$objectID} &&
exists $FLUobject2param{$objectID}{$paramID})
{
$dbh->getObject2Param($objectID,$paramID);
$FLUobject2param{$objectID} = &share({});
$FLUobject2param{$objectID}{$paramID} = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
这是由于有记录的限制:
共享变量只能存储标量,共享变量的引用或共享数据的引用......
上面的代码分别检查散列键以避免自动生成,$FLUobject2param{$objectID}如果它还不存在,则会生成非共享空哈希引用.
在条件内部,我们首先构建适当的脚手架,然后分配值.同样,autovivification通常会为你处理这个问题,但共享迫使我们更加谨慎.