我正在尝试在多个线程上共享多维哈希。
这个哈希保存了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;
}
}
我不断收到错误消息Invalid value for shared scalar
在线上
if(not defined $FLUobject2param{$objectID}{$paramID}){
这显然与perl 的threads::shared 只允许您共享单个级别的共享结构有关。
我仍然如何检查该组合是否已在多个线程上使用?
大多数时候,自动生存是你的朋友,但你必须以共同的价值观来小心它。调整handlethread
:
sub handlethread{
# ...
unless (exists $FLUobject2param{$objectID} &&
exists $FLUobject2param{$objectID}{$paramID})
{
$dbh->getObject2Param($objectID,$paramID);
$FLUobject2param{$objectID} = &share({});
$FLUobject2param{$objectID}{$paramID} = 1;
}
}
这是由于做一个记录的限制:
共享变量只能存储标量、共享变量的引用或共享数据的引用……
上面的代码分别检查哈希键以避免自动生存,这将在其中植入一个不共享的空哈希引用$FLUobject2param{$objectID}
如果它还不存在。
在条件语句中,我们首先构建适当的脚手架,然后分配值。同样,自动生存通常会为您处理这个问题,但共享迫使我们更加深思熟虑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)