Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Exception aus SO

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
05.06.2008, 22:25 Uhr
FunnyDingo



Hallo zusammen,

ich habe gerade in ein via dlopen eingebundenes SO (das zudem noch in einem eigenen thread läuft) ein throw eingebaut, aber leider greift das Exception-Handling (im Hauptbinary) nicht (Fehler: terminate called after throwing an instance of 'tFatalException').

Wenn ich die den try...catch direkt in die lib einbaue läuft zumindest die Ausgabe des Fehlers, aber das Programm wird nicht beendet (kann ja nicht, da der return 1 in dieser Funktion nicht das beenden des Programms veranlasst).

Liegt das nun daran, dass es eine nachgeladene lib ist oder weil es in einem eigenen Thread läuft?

Gibt es dafür ggf. einen Workaround?

Gruß,
Funny
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.06.2008, 14:24 Uhr
stephanw
localhorst


Eine Ausnahme wandert stets den Aufruf-Stack hinab bis. Da jeder Thread ja seinen eigenen Stack hat, kann eine Ausnahme nicht im Haupt-Thread landen, wenn sie im Neben-Thread geworfen wurde. Zumindest ist das meine praktische Erfahrung und ich finde es auch logisch.

Darum vermute ich ganz stark, dass Du Dich darum selbst kümmern musst, Deine Ausnahmen zu synchronisieren.

Ob das Konstrukt mit der dynamischen Bibliothek da eine Rolle spielt, weiß ich nicht. Idealerweise sind beide Komponenten mit Exception-Handlich übersetzt, sofern man das bei Deinem Compiler einstellen kann.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.06.2008, 23:22 Uhr
FunnyDingo



Wie könnte so etwas denn aussehen? Hab da eine Idee, dazu müsste ich aber etwas ausholen:

Mein Haupt-Thread macht eigentlich nichts anderes als 4 Threads zu starten und auf deren Beendigung zu warten (warum ich das nicht mit fork mache: ich muss die Threads "aufwecken" können).

Nun wäre meine Idee ein Strukt mit Bools pro Thread die auf True gesetzt werden wenn der Thread startet und im Exception Handling auf False, bevor pthread_exit() aufgerufen wird.

Aber dann dürfte der Main-Thread ja nicht mehr via pthread_join auf die Beendigung eines Threads warten (so mache ich das bisher, was mir eigentlich auch nicht gefällt), sondern müsste auf Änderungen im Strukt achten, aber das geht ja wieder nicht.

Mein Problem mit den Threads ist: ich finde Tonnen an Infos zu Thread-Programmierung, aber immer nur im Zusammenhang mit Threads die Berechnungen o.ä. machen. Bei mir arbeiten die Threads aber ständig, da ich sie wie gesagt "aufwecken" muss.

Warum aufwecken? Nun ja, ein Thread dient als "Listen Thread" auf einem Socket, einer als "Sender Thread" und der dritte als "Worker Thread". Wenn nun der Listen Thread Daten empfangen hat, schreibt er diese in eine Queue und weckt den Worker (der via pthread_cond_wait "schläft") via pthread_cond_broadcast auf. Dann kann der Worker seine arbeiten erledigen während der Listener schon wieder zur Verfügung steht. Sobald der Worker alles erledigt hat, schreibt er das Result in eine Queue und weckt nun den Sender auf.

Ich habe mich für diesen Weg entschieden, weil ich die Threads halt nur arbeiten lassen möchte, wenn in ihrer Queue Daten drin stehen und ich wollte sie nicht in einer schleife die Queue prüfen lassen.

Vielleicht kennt ja jemand einen besseren Weg, der mir mein Synchronisierungsproblem auch erleichtern würde. Ich hatte bei fork das Problem, dass ich keinen Weg gefunden habe zu sagen: "Warte hier bis du wieder benötigt wirst". Ansonsten wären eigene Child Prozesse ja der bessere Weg.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 09.06.2008 um 23:27 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.06.2008, 10:13 Uhr
FunnyDingo



Mir ist heute gestern Abend noch eine Idee gekommen, die mir ganz gut gefällt:

Ich lege mir ein Strukt mit PIDs an


C++:
strukt {
  pid_t main;
  pid_t listener;
  pid_t worker;
  pid_t sender;
} runningProzess;


Nachdem ich die Prozesse nun gestartet habe, kann ich mit wait() im Main warten. Wenn ich das richtig vertanden habe, bleibt der Hauptprozess bei wait() stehen, bis eins der Childes beendet wurde. Dann kann ich ja a) den Rückgabewert prüfen (der ja mit Hilfe es pro Prozess laufenden Exeption Handlings gesetzt werden kann) und entscheiden ob ich diesen einfach wieder starte (z.B. den Sender Prozess) oder das ganze Programm beenden sollte.

Ich weiß nur noch nicht, wie ich meine "aufweck" Funktion realisieren soll.

Ich habe mir eine Template-Classe für die Queue geschrieben (die ich bei der Arbeit mit Prozessen wohl auf Shared Memory umstellen muss?). Ich hoffe das ich noch einen Weg finde, das in dieser Klasse zu realisieren. Es gibt z.B. eine Methode read(). Ich könnte ja versuchen da ein Blocking einzubauen, das gelöst wird, wenn mir der Methode write() Daten in die Queue geschrieben werden.

Ich werde später noch ein wenig recherchieren, aber wenn jemand spontan einen Tipp hat, wäre ich sehr dankbar.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.06.2008, 21:49 Uhr
FunnyDingo



OK, ich habe mal ein wenig geforscht und ich denke sigsuspend() würde hier mein retter sein.

Bin mir nur noch nicht sicher, ob der Umbau von Threads auf Prozesse wirklich das richtige ist.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 10.06.2008 um 21:51 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: