【问题标题】:What perl built in functions are atomic?哪些 perl 内置函数是原子的?
【发布时间】:2012-10-23 22:30:25
【问题描述】:

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

在某处有清单吗?特别是共享数组原子上的push、pop、shift、unshift 和splice?

谢谢。

【问题讨论】:

  • “没有为共享数组实现拼接”
  • 天啊!这样就没有原子方法可以在没有锁的情况下删除元素。 :-/
  • 好吧,从中间。 unshift 和 pop 工作。请注意,他们肯定会在内部使用某种锁。
  • 对不起,我的意思是“多个元素”。
  • “我正在编写一些线程代码” - 很遗憾听到这个消息,Schwern。我希望你明天感觉更好。

标签: multithreading perl


【解决方案1】:

准则:如果它是 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

【讨论】:

  • "如果是 tie 支持的操作,它就是原子的"为什么?
  • tie 和共享变量都是使用魔法实现的。 (perl -MDevel::Peek -Mthreads -Mthreads::shared -e'my $s :shared; Dump($s);')
猜你喜欢
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多