gpt4 book ai didi

perl - 在信号处理程序中访问/修改共享变量是否安全?

转载 作者:行者123 更新时间:2023-12-01 12:19:10 25 4
gpt4 key购买 nike

在 C 中,信号处理程序只能访问 volatile sig_atomic_t 类型的变量。在 perl 中,运行这种信号处理程序是安全的(并且是原子的)?

my $p = 0;

$SIG{CHLD} = sub {
while (waitpid(-1, WNOHANG) > 0) {
$p--;
}
};

当我的主线程正在处理 $p 时,比如 =+++=

我知道 perl 使用 Safe-Signals但是一个简单的 ++-- 是一个单一的操作码吗? 1-opcode 是什么语言的运算符?

我所说的安全是指什么是原子操作,这样 $p 内容就不会被破坏。

最佳答案

在安全信号下,将 sub 分配给 %SIG 中的信号会导致 Perl 安装一个信号处理程序,该处理程序只会递增一个计数器。此计数器在 Perl 操作码之间进行检查。[1] 只有这样才调用 Perl 子程序。

前递增、后递增、前递减和后递减都是 Perl 操作码,因此它们不会被信号中断。

$ perl -MO=Concise,-exec -e'my $x; ++$x; --$x; $x++; $x--;'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <0> padsv[$x:1,2] vM/LVINTRO
4 <;> nextstate(main 2 -e:1) v:{
5 <0> padsv[$x:1,2] sRM
6 <1> preinc vK/1
7 <;> nextstate(main 2 -e:1) v:{
8 <0> padsv[$x:1,2] sRM
9 <1> predec vK/1
a <;> nextstate(main 2 -e:1) v:{
b <0> padsv[$x:1,2] sRM
c <1> preinc[t2] vK/1
d <;> nextstate(main 2 -e:1) v:{
e <0> padsv[$x:1,2] sRM
f <1> predec[t3] vK/1
g <@> leave[1 ref] vKP/REFC
-e syntax OK

我们还必须查看如何在信号处理程序之外使用 $p 来确定它是否安全。例如,如果信号处理程序之外的代码执行以下操作,您就会遇到问题,因为这可能会被中断。

$p = $p - 1;

这是安全的:

my %children;

$SIG{CHLD} = sub {
local ($?, $!, $^E);
while ( ( my $pid = waitpid(-1, WNOHANG) ) > 0 ) {
my $child = $children{$pid}
or next; # ?!?

$child->{exit_status} = $?;
}
};

while (1) {
...

for my $pid (keys(%children)) {
my $child = $children{$pid};
defined( my $exit_status = $child->{exit_status} )
or next;

delete($children{$pid});

...
}

...
}

  1. 我认为在最近的 Perl 版本中,它的粒度变得更小了。

关于perl - 在信号处理程序中访问/修改共享变量是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45762391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com