my %queue;
$queue{$id} = [$scalar, [$to_handle_data1, $to_handle_data2, ...]];
现在要在多个线程间共享这个数据结构,我是这样写的:
use threads;
use threads::shared;
my %queue:share;
if (not exists $queue{$id}) {
$queue{$id} = &share([$scalar, &share([ $data1 ])]);
} else {
push(@{$queue{$id}->[1]}, $data2); #这句出错,导致线程终止}
程序写出来,不能按我的期望那样跑,哪位熟悉的大侠,能帮我看看这种数据共享应该怎么写才正确呢,谢谢了!=============================================
============================================
打印的错误消息:
thread failed to start: Invalid value for shared scalar at ./xxx.pl line 32.
=================================================
=============================================
解决了,正确的写法如下:
$queue{$id} = &share([]);
push(@{$queue{$id}}, $scalar);
push(@{$queue{$id}}, &share([]));
push(@{$queue{$id}->[1]}, $data);
=======================================
===========================================
函数前面不要写 &,空参数不要写 [],重复使用的 $queue{$id} 可以
再弄个变量代替,这样看起来容易。
=========================================
=========================================
我有些搞不懂为啥它不支持将一整个变量深层地share,非要对每个分量再次share. 技术上有难度吗?
================================================
==============================================
技术上难,使用上也难,因为涉及到引用,你可能无意中就共享了
一大堆东西,垃圾回收也不好做了,因为 Perl 里引用超出作用域
就销毁,如果多线程共享就不行了。
没有评论:
发表评论
写下你的意见和问题,一起进步。谢谢