Wie speichere ich Sockets in einem Hash und schleife sie über einen anderen Thread?

8

Ich arbeite an einem Multithread-TCP-Server. Im Hauptthread höre ich auf einen Socket und erstelle einen neuen Thread für neue eingehende Verbindungen. Ich möchte alle eingehenden Verbindungen in einem Hash speichern, damit ich von einem anderen Thread auf sie zugreifen kann.

Vom Monitor-Thread kann ich keine neu hinzugefügten Verbindungen lesen. Es scheint, dass beim Erstellen des Monitor-Threads ein neuer Client-Hash erstellt wird.

Wie behalte ich die Liste aller Sockets und loope sie von meinem Monitor-Thread?

Aktueller Code:

%Vor%     
Dieterve 04.02.2010, 20:22
quelle

2 Antworten

8

Sie müssen $clients über share von threads::shared teilen:

%Vor%

Die altmodische Syntax ist auf ein dokumentiertes Problem mit den Perl-Prototypen zurückzuführen. Wenn Sie mindestens Perl 5.8.9 haben, verwenden Sie den netteren

%Vor%

stattdessen.

Sie möchten auch $clients mit einer Sperre schützen, z. B. ,

%Vor%

Da IO::Socket::INET -Instanzen Perl-Typglobs sind, können Sie sie nicht freigeben. Fügen Sie stattdessen ihre Socket-Deskriptoren hinzu (aus fileno ) bis $clients und dann fdopen den Socket bei Bedarf mit

%Vor%

Das folgende Programm wiederholt eingehende Daten zu den anderen verbundenen Sockets:

%Vor%     
Greg Bacon 04.02.2010, 21:03
quelle
1

Haben Sie nicht zu viel Erfahrung mit Threads in Perl, aber ich denke, Sie möchten nur Ihre Client-Liste teilen:

%Vor%

Aktualisierung:

Perl klagt über:

%Vor%

aber es scheint in Ordnung zu sein mit:

%Vor%

Auch dieser Code:

%Vor%

scheint die Hashtable zu löschen, aber

%Vor%

funktioniert so, wie ich es erwarten würde.

    
mob 04.02.2010 20:25
quelle

Tags und Links