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% Sie müssen $clients
über share
von threads::shared
teilen:
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. ,
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
Das folgende Programm wiederholt eingehende Daten zu den anderen verbundenen Sockets:
%Vor%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.
Tags und Links multithreading sockets perl