Über Thread Endlosschleife stoppen
-
Hallo an alle,
vllt. ne dumme Frage, kann schon sein.
ich habe in einer Funktion eine Endlosschleife
for(;;) { recvfrom(...); }Diese soll halt nach einiger Zeit beendet werden z.B. nach 3min.
oder wenn eine bestimmte Nachricht reinkommt über einen anderen Socket.Habe mir gedacht. Wenn die Nachricht kommt die das Abbrechen bedingt, setze ne Membervariable Typ bool auf false und frag das ab.
for(;;) { if(!m_bExit) { recvfrom(...); } else break; } //thread der auf Nachrichten des anderen Sockets wartet //nur ein Beispiel. recvfrom(...); if(msg == "EXIT") myClass->m_bExit = true;Jetzt ist halt das Problem das es bisher so ganz gut funzte...bis jetzt an einem System aufgetaucht ist, das er anscheinend nicht darauf reagiert, sondern sich in der Endlosschleife festfrisst und diese gar nicht mehr verlässt.
Gibt es noch andere Wege eine Endlosschleife von außerhalb einer Funktion zu killen?
Gruß
-
Ist recvfrom nicht blockierend? Weil wenn dem so ist (wovon ich jetzt mal ausgehe), kommt es ja gar nicht zu der Prüfung.
-
Nebenbei bemerkt, das Konstrukt
for(;;) { if(!m_bExit) { /* ... */ } else break; }Kommt recht häufig vor. Dafür gibts sogar ein eigenes Schlüsselwort, was es schon anno dunnemals in C gab:
while(!m_bExit) { /* ... */ }
-
Oder wenn man unbedingt for benutzen will:
for(; !m_bExit ;) { //... }
-
Ok...ok, das ist schon richtig mit dem
while(!m_bExit) { /*...* }Hab ich bereits probiert, aber da bekommt er das auch nicht mit.
recvfrom ist über ioctlsocket auf Non-Blocking gesetzt.
-
Ich bin in der Materie noch nicht so 100%ig sicher, aber muss das Flag evtl. volatile sein damit der eine Thread mitkriegt dass der andere drauf geschrieben hat? Sonst kommt doch die Änderung nicht aus dem Cache des einen Prozessors raus und der Hauptspeicher und vor allem der andere Prozessor bekommt nichts davon mit?
Evtl. mal einen Debugger auf den Kopf der while-Schleife setzen udn schauen was passiert. Oder aber bei boost eine condition_variable_any benutzen statt eines bool.
-
Eine stumpfe Ausgabe sollte an der Stelle zumindest zeigen was da genau los ist.

-
Das Problem ist ja das ich den Fehler auf meinen 2 Testrechnern nicht nachvollziehen kann deswegen bringt debuggen nicht so viel.
-
mr. main schrieb:
Das Problem ist ja das ich den Fehler auf meinen 2 Testrechnern nicht nachvollziehen kann deswegen bringt debuggen nicht so viel.
Dann musst du dir überlegen was der Unterschied zwischen den Systemen ist (z.B. dein Testrechner nur ein Prozessor mit einem Cache, der andere ein mehrkernprozessor mit mehreren Caches?) und schlimmstenfalls auf dem System wo der Fehler auftaucht (oder auf einem identischen System, gleiches OS, baugleiche Hardware) einen Debugger installieren. Oder es blind versuchen mit den Möglichkeiten die ich aufgelistet hab.
-
Ich glaube auf ein volatile kann man sich diesbezüglich nicht verlassen. Dazu gab es hier mal eine Diskussion. Man müsste schon einen Mutex für das bool behmen.
-
pumuckl schrieb:
while(!m_bExit)
...