【发布时间】:2011-01-07 04:32:21
【问题描述】:
问题
多个线程在 shared 散列中获取和存储简单的单个值是否安全,而无需 lock() 处理散列?
你能证明它或引用强大的权威吗?
背景
我的信念是,在最坏的情况下,未锁定的哈希操作可能会导致段错误。
但是,我最近看到了以作者认为安全的方式协调工作线程活动的代码。有问题的代码只执行简单的获取和存储:
- 共享哈希是普通的共享哈希(不是用户定义的 tie()d 构造)
- 这些值是简单的标量,不是引用,也不是共享的
- 每个键/值对由一个且只有一个线程唯一存储和修改
- 任何线程都可以获取所有键/值对
- 没有线程遍历共享哈希(没有
each()、没有keys()也没有values()循环)
代码摘录
my %status : shared;
for my $id (1 .. $n) {
threads->create(\&thread_routine);
}
sub thread_routine {
my $me = threads->tid();
$status{ $me } = 'Getting ready';
... do something ...
$status{ $me } = 'Thinking';
... do something else ...
$status{ $me } = 'Looking around';
for my $tid (threads->list) {
next if $tid == $me;
if ($status{ $tid } eq "Thinking") { ... react ... }
...
}
$status{ $me } = 'All done';
}
【问题讨论】:
-
最后一行的
$key不应该是$me吗? -
@cjm,没错。已更新。
标签: multithreading perl race-condition