Pergunta

Vamos dizer que eu tenho um fio:

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
                    );
         }

}       

Uma vez que eu tenho desde há tempo limite para select() e bloqueia indefinidamente até que a atividade é detectada em um dos o descritor (bem, "punho") sets, o que acontece se outra modifica fio o conteúdo dos conjuntos (por exemplo, adiciona um novo socket para polling)?

É implementado de uma forma thread-safe, relativa à implementação do Perl POSIX threads?

Se não, eu acho que pode furar a chamada select() bloqueando em um bloco com seu próprio escopo e bloquear os conjuntos ou, mais correctamente, os inteiros de dados de pacotes. Qual é a melhor maneira de acordar select() até o retorno, de outro segmento para que o conteúdo dos conjuntos podem ser manipulados? -Thread específico de sinal? Semáforo? Sugestões bem-vindos.

Graças muchly!

Editar: Bem, "sinal" específico da thread está fora. Como explicado aqui ( http://perldoc.perl.org/threads.html ): " correspondentemente, o envio de um sinal para um thread não perturbar o funcionamento do segmento está atualmente trabalhando em:. o sinal será posta em prática após a operação atual foi concluída Por exemplo, se o fio está preso em uma chamada I / o, enviá-lo um sinal não irá causar a chamada I / o para ser interrompida de modo que o sinal é colocada em prática imediatamente. "

Isso deixa ainda me perguntando como eu deveria lidar com a questão de acordar select()-se em um segmento se eu quero isso para bloquear indefinidamente em vez de voltar depois de um tempo limite fixo.

Foi útil?

Solução

Por padrão, tópicos perl não compartilhar os dados, por isso, se um segmento muda seus conjuntos não vai afetar o outro. Então, sim, é thread-safe, mas provavelmente não faz o que você quer fazer.

Se você realmente quer acordar-up outro segmento ou processo que está bloqueando em um select, uma solução fácil é adicionar um tubo à sua fila de leitura. Você pode então acordá-lo por escrever um byte para que pipe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top