Anzeige:
Ergebnis 1 bis 8 von 8

Thema: Streams in Multi-Thread-Programm

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.10.2007
    Beiträge
    12

    Unhappy 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

  2. #2
    Registrierter Benutzer Avatar von Boron
    Registriert seit
    07.01.2002
    Beiträge
    827
    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 .

    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.
    Gruß Boron (der sich oft wegen mieser Rechtschreibung anderer die Augen reiben muss)

    LINUX IS LIKE AN INDIAN TENT: NO GATES, NO WINDOWS AND AN APACHE INSIDE!
    Hardware Monitoring unter Linux -> http://santafu.sourceforge.net (Temperaturen, Lüfterdrehzahlen und Spannungen)

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.10.2007
    Beiträge
    12
    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?

  4. #4
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Z.B. indem Thread B Thread A mitteilt, dass er jetzt die Verbindung schliessen kann.
    Geändert von jeebee (27-05-2008 um 09:19 Uhr) Grund: typos
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  5. #5
    Registrierter Benutzer
    Registriert seit
    08.10.2007
    Beiträge
    12
    OK, und wie mache ich das konkret?

    Wie kann ein Thread Nachrichten eines anderen Threads empfangen, während er auf Netzwerkeingaben wartet?

  6. #6
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    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.
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  7. #7
    Registrierter Benutzer
    Registriert seit
    08.10.2007
    Beiträge
    12
    Danke für den Tip!

    select() benutze ich momentan nicht.
    Mal sehen, in wie weit ich meine Architektur ändern kann/muss.

  8. #8
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    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.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •