Multithreading 什么perl内置函数是原子函数?

Multithreading 什么perl内置函数是原子函数?,multithreading,perl,Multithreading,Perl,我正在编写一些线程代码,我想知道什么Perl内置函数和运算符是原子的,可以在共享变量上安全地使用,而无需锁定。例如,有人告诉我,++、--、+=等不是因为它们是作为两个操作实现的 有什么清单吗?特别是共享阵列原子上的推送、弹出、移位、取消移位和拼接 谢谢。指南:如果是tie支持的操作,那么它是原子操作。否则,就不是了 控制: use strict; use warnings; use feature qw( say ); use threads; use threads::shared; us

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

有什么清单吗?特别是共享阵列原子上的
推送
弹出
移位
取消移位
拼接


谢谢。

指南:如果是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

“共享阵列未实现拼接”噢!这使得没有原子方法可以在没有锁的情况下移除元素-/嗯,从中间开始<代码>取消移位
弹出
工作。请注意,他们肯定在内部使用了某种锁。对不起,我的意思是“多元素”。“我正在编写一些线程代码”-听到这个消息我很难过,Schwern。我希望你明天感觉更好。“如果这是tie支持的操作,那么它是原子的”为什么?tie和共享变量都是用魔法实现的。(
perl-MDevel::Peek-Mthreads-Mthreads::shared-e'my$s:shared;Dump$s);”