gpt4 book ai didi

perl - IO::Select线程中的select()包装器安全吗?如何解决?

转载 作者:行者123 更新时间:2023-12-03 11:53:32 24 4
gpt4 key购买 nike

假设我有一个线程:

sub     new {
my $class = shift;
my $self = ref $class || $class;

bless { 'read_set' => IO::Select->new,
'write_set' => IO::Select->new,
'error_set' => IO::Select->new }, $self;
}


sub start {
my $self = shift;

$self->{'thread'} = threads->create(\&worker_thr, $self);
$self->{'thread'}->detach;
}

sub worker_thr {
my $self = shift;

while(1) {
my($read_active, $write_active, $error_active) =
IO::Select->select(
$self->{'read_set'},
$self->{'write_set'},
$self->{'error_set'},
undef
);
}

}

由于我没有为 select()提供超时,并且它会无限期地阻塞,直到在一个描述符集(好是“handle”)上检测到 Activity 为止,如果另一个线程修改了集的内容(例如,添加了一个新的用于轮询的套接字),会发生什么情况?

相对于Perl POSIX线程实现,它是以线程安全的方式实现的吗?

如果没有,我想我可以将阻塞的 select()调用粘贴在具有自己作用域的块中,并锁定集合,或者更确切地说,锁定整个包数据。唤醒 select()从另一个线程返回以便可以操作集合内容的最佳方法是什么?特定于线程的信号?信号?欢迎提出建议。

非常感谢!

编辑:好吧,特定于线程的“信号”消失了。如此处( http://perldoc.perl.org/threads.html)所述:“相应地,向线程发送信号不会中断该线程当前正在执行的操作:在当前操作完成之后,该信号才会生效。例如,如果线程停留在一个I/O调用,向它发送信号不会导致该I/O调用被中断,从而使信号立即起作用。”

这仍然让我想知道如果我希望无限期地阻塞而不是在固定的超时后返回,应该如何处理在线程中唤醒 select()的问题。

最佳答案

默认情况下,perl线程不共享任何数据,因此,如果一个线程更改了其设置,则不会影响另一个线程。因此,是的,它是线程安全的,但是它可能没有执行您想要的操作。

如果您真的想唤醒在选择中阻塞的另一个线程或进程,一个简单的解决方案是在其读取队列中添加管道。然后,您可以通过向该管道写入一个字节来唤醒它。

关于perl - IO::Select线程中的select()包装器安全吗?如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1011338/

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