8

我正在编写一些线程代码,我想知道 Perl 内置的函数和运算符是原子的并且可以安全地在共享变量上使用而无需锁定。例如,有人告诉我++,--+=不是因为它们是作为两个操作实现的。

某处有清单吗?特别是push, pop, shift,unshiftsplice在共享数组上是原子的吗?

谢谢。

4

1 回答 1

7

指导原则:如果是 tie 支持的操作,它是原子的。否则,它不是。

控制:

use strict;
use warnings;
use feature qw( say );
use threads;
use threads::shared;

use constant NUM_THREADS => 4;
use constant NUM_OPS     => 100_000;

my $q :shared = 0;

my @threads;
for (1..NUM_THREADS) {
   push @threads, async {
      for (1..NUM_OPS) {
         ++$q;
      }
   };
}

$_->join for @threads;

say "Got:      ", $q;
say "Expected: ", NUM_THREADS * NUM_OPS;
say $q == NUM_THREADS * NUM_OPS ? "ok" : "fail";

输出:

Got:      163561
Expected: 400000
fail

push @a, 1;而不是++$q

Got:      400000
Expected: 400000
ok
于 2012-10-23T23:17:02.423 回答