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



这是我从threads::shared描述中读到的:

默认情况下,变量对每个线程都是私有的,每个新创建的线程都会获得每个现有变量的私有副本。此模块允许您在不同的线程之间共享变量。。。(更多)

假设我有一个这样的共享变量:

my $var :shared;
$var = 10;

这意味着对于我创建的所有线程,该变量只存在一次。


现在谈谈原子性和可见性:

如果thread_A分配了一个新值,比如11:

$var = 11;

是否保证thread_B(以及我可能创建的所有其他线程)将看到值11?分配是原子执行的吗?

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

或者这就像Java中的volatile基元变量一样?

在更新中强制执行原子性始终是一种很好的做法。Perl提供了lock来允许我们这样做。您可以lock变量本身——如果变量与线程共享,那么锁定状态也是如此。

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

但你确实有一个潜在的种族条件,这取决于他们何时访问它。如果这是一个问题-lock,如果不是。。。继续

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

最新更新