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

use*_*516 6 java perl multithreading visibility atomicity

我从threads::shared描述中读到:

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

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

my $var :shared;
$var = 10;
Run Code Online (Sandbox Code Playgroud)

这意味着变量仅对我创建的所有线程存在一次.


现在关于原子性和可见性:

如果thread_A分配了一个新值,那么就说11:

$var = 11;
Run Code Online (Sandbox Code Playgroud)

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

或者我们是否首先在Java中获取锁定,然后执行赋值并释放锁定.并且只有使用相同锁的线程才能保证看到更新后的值?

或者这表现得像Java中的volatile原始变量?

Sob*_*que 4

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

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

但你确实有潜在的竞争条件,具体取决于他们何时访问它。如果这是一个问题——lock如果不是……继续。

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