Frage

Lassen Sie uns sagen, ich habe einen Thread:

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

}       

Da ich kein Timeout bereitgestellt select() und blockiert es auf unbestimmte Zeit bis zur Aktivität auf einem der Deskriptor erfaßt wird (gut, „handle“) setzt, was ein anderer Thread passiert, wenn der Inhalt der Sätze verändert (zB fügt eine neue Socket für Polling)?

Ist es in einem Thread-sichere Art und Weise umgesetzt werden, in Bezug auf die Perl-POSIX-Threads Implementierung?

Wenn nicht, nehme ich ich kann die Blockierung select() Anruf in einem Block mit einem eigenen Rahmen bleiben und verriegeln Sie die Sätze oder, sauber, die gesamten Paketdaten. Was ist der beste Weg, von einem anderen Thread zurückkehren select() aufzuwecken, damit der Inhalt der Sätze manipuliert werden kann? Thread-spezifisches Signal? Semaphor? Vorschläge willkommen.

Danke muchly!

Edit: Nun, Thread-spezifische "Signal" ist out. Wie hier erklärt ( http://perldoc.perl.org/threads.html ): " entsprechend unterbricht den Betrieb ein Signal an einen Thread sendet der Thread gerade arbeitet: das Signal wird beaufschlagt werden, nachdem der aktuelle Vorgang abgeschlossen ist zum Beispiel, wenn der Faden auf einem I / O-Anruf steckt, es zu senden. ein Signal wird der I / O-Aufruf so unterbrochen wird nicht dazu führen, dass das Signal sofort gehandelt nach oben. "

Das noch läßt mich fragen, wie ich das Problem umgehen sollte in einem Thread select() des Aufwachen, wenn ich es will auf unbestimmte Zeit statt blockieren nach einer festen Timeout zurückzukehren.

War es hilfreich?

Lösung

In der Standardeinstellung Perl Threads teilen keine Daten, so dass, wenn ein Thread seine Sätze ändert, wird es die andere nicht beeinflussen. Also ja, es ist Thread-sicher, aber es ist wahrscheinlich nicht tun, was Sie tun wollen.

Wenn Sie wirklich Weck- wollen einen weiteren Thread oder Prozess, der auf einem ausgewählten blockt, eine einfache Lösung ist es, ein Rohr zu addieren, um ihn Warteschlange gelesen hat. Sie können es dann aufwachen durch ein Byte an diesem Rohr zu schreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top