Socket in Multithreading umgebung
-
Hallo Community,
wenn ich mal ein kleine Frage stellen darf,
stellt das schreiben auf ein Socket aus zwei Threads ein Problem dar?
D.h ich habe zwei Threads und ein Socket können beide ohne Synchronisation drauf schreiben ?Grüße
-
Sockets werden im C Standard nicht definiert => es hängt vom Betriebssystem ab
Für Unix würde ich annehmen, dass es mit send/write funktioniert, da es sich um Systemcalls handelt.
-
Aber welchen Sinn macht das? Wie soll die Lesefunktion die Daten dann wieder sinnvoll auslesen können (es ist ja nicht garantiert, daß jeweils komplette Blöcke je Thread versendet werden).
-
@th69 sagte in Socket in Multithreading umgebung:
(es ist ja nicht garantiert, daß jeweils komplette Blöcke je Thread versendet werden).
Ich gehe davon aus, dass es für Unix garantiert ist. send/write werden nicht im jeweiligen Thread ausgeführt.
-
@mb2018 sagte in Socket in Multithreading umgebung:
stellt das schreiben auf ein Socket aus zwei Threads ein Problem dar?
D.h ich habe zwei Threads und ein Socket können beide ohne Synchronisation drauf schreiben ?Was erwartest du dir als Ergebnis?
-
vielleicht solltest du dein programmdesign so ändern, dass nur ein thread für das senden und empfangen von daten verantwortlich ist.
ps: probier es dir aus und schick jeweils immer wieder z.b. 1MiB (oder 10MiB, 100MiB) über den socket und lass dir den rückgabewert ausgeben.
-
Die Bytes kommen auf der anderen Seite gemischt an, wenn beide Threads frei senden dürfen.
-
@rapper sagte in Socket in Multithreading umgebung:
Die Bytes kommen auf der anderen Seite gemischt an, wenn beide Threads frei senden dürfen.
Ich meine das ist falsch.
-
@manni66
Das ist wie mit Ausgaben auf der Konsole. Wenn 2 Threads etwas zugleich ausgeben bekommst du auch lustigen Datensalat angezeigt.
-
Wenn du zwei Threads für zwei Verbindungen brauchst würde ich an deiner Stelle einen Punkt machen, weil dass muss anders.
-
@wade1234 sagte in Socket in Multithreading umgebung:
vielleicht solltest du dein programmdesign so ändern, dass nur ein thread für das senden und empfangen von daten verantwortlich ist.
ps: probier es dir aus und schick jeweils immer wieder z.b. 1MiB (oder 10MiB, 100MiB) über den socket und lass dir den rückgabewert ausgeben.
Das ist die Frage, ob ich muss bei meinen Tests habe ich bis jetzt kein Problem entdeckt. Allerdings habe ich mir gestern die Frage gestellt, ob das tatsächlich ein Problem darstellen kann.
-
zu 100% kann ich dir das auch nicht sagen. meine "lieblingsseite für unix" sagt aber folgendes:
"A thread-safe function is one that can be safely (i.e., it will
deliver the same results regardless of whether it is) called from
multiple threads at the same time.
POSIX.1-2001 and POSIX.1-2008 require that all functions specified in
the standard shall be thread-safe, except for the following
functions: [...]" (http://man7.org/linux/man-pages/man7/pthreads.7.html)weder read und write, noch recv und send sind dort aufgeführt, also eigentlich dürfte das kein problem darstellen.
bei windows ist das nach meinem wissen nicht so.
-
@rapper sagte in Socket in Multithreading umgebung:
@manni66
Das ist wie mit Ausgaben auf der Konsole.Stimmt
Wenn 2 Threads etwas zugleich ausgeben bekommst du auch lustigen Datensalat angezeigt.
Nicht mit write auf Unix
-
Da unter Unix alles ein File ist, wäre es äußerst merkwürdig wenn du Recht hättest.
-
@manni66 sagte in Socket in Multithreading umgebung:
Nicht mit write auf Unix
Was passiert denn, wenn ein Thread write aufruft, dann unterbrochen wird und ein zweiter Thread write aufruft,
vorausgesetzt beide verwenden das selbe FILE*?
-
@rapper sagte in Socket in Multithreading umgebung:
@manni66 sagte in Socket in Multithreading umgebung:
Nicht mit write auf Unix
Was passiert denn, wenn ein Thread write aufruft, dann unterbrochen wird und ein zweiter Thread write aufruft,
nichts was die beiden Outputs vermischt
vorausgesetzt beide verwenden das selbe FILE*?
write abeitet nicht mit FILE*.
-
@manni66 sagte in Socket in Multithreading umgebung:
nichts was die beiden Outputs vermischt
Also kann nur ein Thread write aufrufen? Oder hat jeder Thread einen eigenen Buffer für write? Und erst wenn die Datei geschlossen wird, wird geschrieben? Das finde ich seltsam. Aber gut. Mag ja alles sein. Würde mich aber mal interessieren was wirklich passiert.
zum FILE*:
dann eben ein Handle, whatever. Bezüglich des Themas ein unwichtiges Detail.
-
@rapper sagte in Socket in Multithreading umgebung:
Oder hat jeder Thread einen eigenen Buffer für write?
write()
ist nicht "buffered".
-
deshalb wirst du, wenn du jedes mal 20 byte sendest, auch nur sehr geringe Datenraten von 1,5 MB/s haben. sendest du dagegen 1MB erhöht sich das um einiges.
-
write ist POSIX.1, und POSIX ist auch ein C Standard, wenn auch nicht der C Sprachstandard, insofern sind wir hier noch ontopic.
Gemäß Thread-Safety ist write auch multithreadsafe.
Es ist aber sinnfrei, aus 2 Threads dasselbe socket zu beschreiben, da write nicht immer den kompletten Datenblock schreiben muss (return auswerten!), und du so nur zufällig "richtige" Daten als Ergebis am socket erhältst.
Das willst du sicher nicht, dein Testlauf mit Spieldaten und "richtigen" Ergebnissen sagt überhaupt nichts aus.