BSD- Sockets thread safe?
-
Hi, ich habe vor ein kleines einfaches Chatprogramm zu schreiben. Ich habe schon erkannt, dass das ohne Threads nicht funktionieren kann, denn wie soll man sonst etwas verschicken können, wenn man gleichzeitig auf eingehende daten wartet?
Nun, ich dachte mir ich werde einen Thread mit select() warten lassen, bis Daten zum lesen vorhanden sind, aber in einem anderen Thread auf Usereingaben warten und wenn welche vorhanden sind, diese dann verschicken.
Nun, meine Frage ist: Ist es überhaupt möglich gleichzeitig auf ein und demselben socket zu schreiben und zu lesen? Ist die BSD- Sockets bibliothek thread safe?
-
sockets sind wie filedescriptoren nicht threadsave. wenn du mehrmals gleichzeitig was rausschreibst, ist nicht definiert, was als erstes rausgeschrieben wird und ob alles in einem geschrieben wird. ein beispiel wäre, dass du mit thread 1 was ausgibst, was nur zur hälfte geschrieben wird. dann gibt thread 2 was aus und du hast somit einen teil der daten von thread 1 und einen teil der daten von thread 2 ausgegeben.
-
Nun, das leuchtet ein, wenn ich gleichzeitig von 2 threads aus auf einen file descriptor schreibe, dann führt das zu unberechenbarem Verhalten.
Wie sieht es allerdings aus, wenn ich auf den gleichen Socket gleichzig schreibe und lese? Oder wie siehts aus, wenn der Socket in einem select()- Aufruf "steckt", und ich ihn dann aus einem anderen thread beschreibe?
-
was du in einen socket reinschreibst, kommt ja nicht wieder heraus, wenn du davon liest. das mit dem select sollte egal sein. mit select erkennst du im prinzip nur, ob du daten schreiben oder lesen kannst. wenn du daten schreibst, obwohl select das im einen thread noch nicht "erlaubt" hat, wird write wohl lange blockieren, nehm ich an. aber ich muss gestehen, dass ich sowas noch nie ausprobiert habe. wenn du mit select auf daten wartest, ist das komplett egal, wenn du währenddessen daten reinscheibst. lesen und schreiben hat im prinzip auf einem socket nichts miteinander zu tun.