2014-10-06 81 views
6

这是我从threads::shared说明写着:Perl的共享变量原子性和可见性

默认情况下,变量是对每个线程专用,每个新创建的线程获取每个存在的变量的专用副本。此模块可让您在不同的线程共享变量... (more)

比方说,我有一个这样的共享变量:

my $var :shared; 
$var = 10; 

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


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

如果thread_A赋新值让我们说11:

$var = 11; 

能够保证所有的thread_B(和所有我可能已经创建了其他线程)会看到值11? 而且是分配执行原子?

或者我们有没有像Java那样首先获得一个锁,然后完成任务并释放锁。只有使用相同锁的线程才能保证看到更新的值?

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

回答

4

在更新中实施原子性总是一个好习惯。 Perl提供了lock来允许我们这样做。变量本身可以是lock - 如果变量与线程共享,那么锁定状态也是如此。

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

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

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