私はいくつかのスレッドコードを書いていますが、Perlに組み込まれている関数と演算子はアトミックであり、ロックせずに共有変数で安全に使用できるのでしょうか。たとえば、、などは2つの操作として実装されているためではないと言わ++
れています。--
+=
どこかにリストはありますか?特に、、、、push
および共有配列上にアトミックですかpop
?shift
unshift
splice
ありがとう。
私はいくつかのスレッドコードを書いていますが、Perlに組み込まれている関数と演算子はアトミックであり、ロックせずに共有変数で安全に使用できるのでしょうか。たとえば、、などは2つの操作として実装されているためではないと言わ++
れています。--
+=
どこかにリストはありますか?特に、、、、push
および共有配列上にアトミックですかpop
?shift
unshift
splice
ありがとう。
ガイドライン: 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