【问题标题】:Perl shared variables atomicity and visibilityPerl 共享变量的原子性和可见性
【发布时间】:2014-11-30 15:53:20
【问题描述】:

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

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

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

my $var :shared;
$var = 10;

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


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

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

$var = 11;

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

或者我们是否像在 Java 中一样首先获取锁,然后进行分配并释放锁。并且只有使用相同锁的线程才能保证看到更新的值?

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

【问题讨论】:

    标签: java multithreading perl visibility atomic


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-20
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2017-08-09
      相关资源
      最近更新 更多