2009-06-18 3 views
2

의 내가 스레드 있다고 가정 해 봅시다 : 다른 경우 발생하는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()가 발생하는 문제를 어떻게 처리해야하는지 궁금합니다.

답변

2

기본적으로 perl 스레드는 데이터를 공유하지 않으므로 한 스레드가 설정을 변경하면 다른 스레드에 영향을 미치지 않습니다. 그래서 네, 스레드로부터 안전하지만, 아마 당신이 원하는 것을하지 않습니다.

선택에서 다른 스레드 나 프로세스를 깨우려는 경우, 읽기 큐에 파이프를 추가하는 것이 쉬운 해결책입니다. 그런 다음 해당 파이프에 바이트를 쓰면 깨울 수 있습니다.

+0

이봐, 그건 나쁜 생각이 아니야! –