8

私はいくつかのスレッドコードを書いていますが、Perlに組み込まれている関数と演算子はアトミックであり、ロックせずに共有変数で安全に使用できるのでしょうか。たとえば、、などは2つの操作として実装されているためではないと言わ++れています。--+=

どこかにリストはありますか?特に、、、、pushおよび共有配列上にアトミックですかpopshiftunshiftsplice

ありがとう。

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 に答える