Sockets und Threads
-
ich hab hier mein Serverprogramm, das behandelt verbindungen zwischen geräten und kontroll-clients, um eine hohe effizienz zu haben wollte ich alle Socketverbindungen zu den geräten in ein fd_set legen und mit select auf eingang prüfen
da aber auch schreibvorgänge stattfinden, wollt ich lesen und schreiben entkoppeln, indem ich 2 threads verwende.
meine frage ist nun, kann man aus 2 threads heraus
1-tens auf socket A lesen und gleichzeitig auf socket B schreiben
2-tens auf socket A gleichzeitig lesen und schreiben(ich geh mal von einkernprozessoren btw. fehlender coreaufteilung aus also nicht wirklich "gleichzeitig")
Threads sind die hölle, ich weis aber ich wüste auf anhieb keinen besseren weg
EDIT: konnte man an Sockets nicht auch irgendwie ein Event / eine Message hängen was dann bei daten auslöst ?
-
*push*
sorry, aber das problem ist ich mach grad ne konzeption (und die soll vor feierabend auch n ergebnis liefern), deswegen muss ich das nochmal pushen
PS das mit dem event hab ich gefunden, aber iss doch cniht das was ich gesucht hatte
-
Wie "gleichzeitig" muss "gleichzeitig" sein? Bzw. "gleichzeitig" auf einem 1 Kern CPU wirds eh nicht geben, wie Du schon gesagt hast.
Wenn es Dir nur darum geht, dass eine Socket Funktion nicht blockiert, dann kann es schon funzen wie Du es beschrieben hast. (Dazu ist ja auch die select() Fkt. da, um prüfen zu können, ob eine Fkt. blockieren wird.)
Vorausgesetzt, Du kannst warten bis send() und recv() zurückkehren (angenommen, die Daten können direkt verschickt bzw. empfangen werden)
-
nja ich geh mal worst case davon aus das mitten in der ausführung des recv, der send befehl startet und auf dem socket wo grad recv läuft versucht zu senden.
WENN der socket optimal arbeitet, müsste ich parallel aus dem recvbuffer lesen und in den sendbuffer schreiben können, der socket würde dann bei "nächster gelegenheit" die daten aus dem sendbuffer senden
wie gesagt, ich suche nur eine beschtätigung meine annahme, da ich eine critical section oder ein lock auf den socket vermeiden möchte
EDIT: ich schieb mal n beispiel nach
client -> Server -> Gerät
Client sendet Befehl zu Server, der zu Gerät sendet.
Gerät brauch etwas zeit um zu antwortenClient sendet neuen Befehl zu Server, während Gerät seine Antwort auf Befehl 1 versendet.
Auf dem Socket vom Server zum Gerät liegt jetzt eine Nachricht vom Gerät vor, der eseThread liesst das paket, ABER genau im selben moment versucht der sende thread auf diesem socket auch zu schreiben.
würde das zu problemem führen? ist der socket intern dagegen geschützt? wie könnte ich das problem anders umgehen?