2009年5月29日星期五

Per 多线程共享数据的问题

我有个多线程的应用,要共享一个数据结构——一个按id分类访问的多队列,具体讲就是一个hash,hash键是id,hash值是一个匿名数组引用,匿名数组
的第一个元素是一个标量(队列的属性),匿名数组的第二个元素是一个匿名数组引用(队列的数据),非多线程写法就是如下:
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 里引用超出作用域
就销毁,如果多线程共享就不行了。

没有评论:

发表评论

写下你的意见和问题,一起进步。谢谢