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