Archiv verlassen und diese Seite im Standarddesign anzeigen : Streams in Multi-Thread-Programm
Hallo,
ich habe mehrere Threads in meinem Programm. Thread A öffnet eine Socket-Verbindung und greift auf diese über Streams zu.
Von Thread B aus will ich diese Verbindung nun schließen. Thread A wartet derweil aber noch auf Eingaben. In meinem Fall befindet er sich in der Funktion fgets().
Mein Problem dabei: Die Funktion fclose(), (von Thread B aus aufgefrufen) hängt d.h. kehrt nicht zurück.
Ist das prinzipiell der falsche Ansatz? Ergibt sich daraus ein Deadlock? Oder muss der Fehler wo anders liegen?
Vielen Dank im voraus!
Alu
Es weiß ja nur Thread A wann es die Verbindung nicht mehr braucht. Wenn nun Thread B die Verbindung dem Thread A "unterm Arsch wegzieht" ist das natürlich blöd :D.
Zwei Möglichkeiten (meiner Meinung nach):
Thread A benachrichtigt B wann A die Verbindung nicht mehr braucht. Thread A schließt die Verbindung selbst.
Die erste Möglichkeit würde ich nur wählen, wenn es einen absolut zwingenden Grund gibt, dass A die Verbindung nicht selbst schließen soll.
In diesem speziellen Fall weiß Thread A eben nicht, dass die Verbindung nicht mehr gebraucht wird.
Es handelt sich hier um den Fall, dass in der GUI auf "Beenden" geklickt wird. Das merkt nur Thread B.
Bevor ich jetzt die Anwendung schließe, würde ich gerne noch die Netzwerkverbindung schließen. (Thread A wartet die ganze Zeit auf Eingaben aus dem Netz.)
Wie löst man das am elegantesten?
Z.B. indem Thread B Thread A mitteilt, dass er jetzt die Verbindung schliessen kann.
OK, und wie mache ich das konkret?
Wie kann ein Thread Nachrichten eines anderen Threads empfangen, während er auf Netzwerkeingaben wartet?
Kommt drauf an wie du auf Netzwerkeingaben wartest. Falls du das mit select() machst, kannst du dem select()-Aufruf auch noch einen weiteren File-Deskriptor übergeben welcher zu einer Pipe zwischen Thread A und Thread B gehört und über welche du eine Nachricht sendest, falls der Benutzer das Programm beendet.
Danke für den Tip!
select() benutze ich momentan nicht.
Mal sehen, in wie weit ich meine Architektur ändern kann/muss.
Unter POSIX kompatiblem Betreibssystemen kannst du auch geziehlt einen Thread ein Signal schicken. Ein Aufruf auf recv bricht ab wenn ein Signal ankommt und meldet das mit entsprechendem return Code und errno. Dann kannst du entsprechend reagieren.
EINTR The receive was interrupted by delivery of a signal before any data were available.
Sprich das geht nur wenn noch garnix empfangen wurde. Also ganz ähnlich wie der select Ansatz. Aja, und unter Windows geht das AFAIK nicht, denn da wird ein Signal immer an einen ganzen Prozess gesendet und nicht nur an einen einzelnen Thread.
Alternativ zu select kannst auch poll verwenden, was fast genau das selbe ist, aber in manchen Fällen praktischer zu verwenden ist. Ließ die entsprechenden manpages.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.