Socket in Multithreading umgebung
-
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.
-
@wutz sagte in Socket in Multithreading umgebung:
da write nicht immer den kompletten Datenblock schreiben muss
write()
ist für socketssend()
. Ich würde die Doku dort so interpretieren, dass dies für blockierende Sockets nicht passiert.