Perl 共享变量的原子性和可见性

6
我从threads::shared的描述中了解到:
默认情况下,变量对于每个线程都是私有的,并且每个新创建的线程都会获得每个现有变量的私有副本。此模块允许您在不同的线程之间共享变量...(更多) 假设我有一个这样的共享变量:
my $var :shared;
$var = 10;

这意味着这个变量只存在于我创建的所有线程中一次。
现在讲解原子性和可见性:
如果线程A分配了一个新值,比如11:
$var = 11;

线程B(以及其他可能已创建的线程)能否保证看到值为11?这个赋值操作是原子性的吗?

还是像Java一样需要先获取锁,然后进行赋值操作并释放锁,只有使用相同锁的线程才能保证看到更新后的值?

或者这就像Java中的易失性原语变量?

1个回答

4

在更新操作中,强制原子性总是一个好的实践。Perl提供了lock函数来允许我们这样做。您可以锁定变量本身 - 如果变量与线程共享,则锁定状态也是如此。

如果您更新$var,则其他线程将看到新值。

但是,根据它们何时访问它,您可能会面临潜在的竞争条件。如果是问题-执行lock操作,否则继续执行。

请注意,像$var ++这样的操作不能保证是原子操作。(http://perldoc.perl.org/perlthrtut.html#Thread-Pitfalls%3a-Races


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接