의 내가 스레드 있다고 가정 해 봅시다 : 다른 경우 발생하는select() 래퍼는 IO :: Select thread-safe에 있습니까? 어떻게 해결할 수 있을까요?
활동이 기술자 중 하나 (물론, "처리") 세트에서 감지 될 때까지 내가select()
에 제한 시간을 제공하지 무기한 차단했기 때문에
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
);
}
}
, thread가 세트의 내용을 변경합니다 (폴링 용의 새로운 소켓을 추가하는 등)?
Perl POSIX 스레드 구현과 관련하여 스레드 안전 방식으로 구현 되었습니까?
그렇지 않은 경우 블록 select()
을 자체 범위의 블록으로 호출하고 세트를 고정 시키거나 더 명확하게 전체 패키지 데이터를 잠글 수 있다고 가정합니다. 깨닫는 가장 좋은 방법은 select()
다른 스레드에서 반환하므로 집합의 내용을 조작 할 수 있습니까? 스레드 별 신호? 신호기? 제안을 환영합니다.
감사합니다.
편집 : 글쎄, 스레드 특정 "신호"입니다. (http://perldoc.perl.org/threads.html) 설명 : "대응하여, 스레드로 신호를 보내면 스레드가 현재 작업하고있는 작업이 중단되지 않습니다. 현재 작업이 완료된 후 신호가 작동합니다. 예를 들어 스레드가 멈춘 경우 I/O 호출이 신호를 보내면 I/O 호출이 중단되어 신호가 즉시 작동하지 않습니다. "
여전히 고정 대기 시간 후에 돌아 오는 대신 무한정 차단하려는 경우 스레드가 깨지면 select()
가 발생하는 문제를 어떻게 처리해야하는지 궁금합니다.
이봐, 그건 나쁜 생각이 아니야! –