Forum: PC-Programmierung c++ Thread schießt das ganze Programm ab


von GNU (Gast)


Lesenswert?

Hallo,
ich habe ein Programm, dass eine Funktion aufruft, die wiederum einen 
Thread startet. Wenn der Thread fertig ist, beendet sich auch die 
dazugehörige Funktion. Statt danach zurück in die Main zu springen, 
beendet sich das Programm "terminate called without an active exception
". Das Programm soll aber weiterlaufen. Ich benutze Linux, falls das 
wichtig ist. Hier mal der Ablauf:
1
bool threadRuns = false,;
2
3
void thread()
4
{
5
  doSth();
6
  threadRuns = false;
7
}
8
9
void Funktion()
10
{
11
  std::thread clientConnectThread(thread);
12
13
  while(!threadRuns)
14
  {
15
    
16
  }
17
18
  return 0;  //Hier bricht das Programm ab
19
}
20
21
int main()
22
{
23
  Funktion();
24
  //Der Rest wird nicht ausgeführt
25
}

Weiß jemand was?

von Nachteule (Gast)


Lesenswert?

GNU schrieb:
1
> bool threadRuns = false,;
Da muss das Komma am Ende weg.
1
> void thread()
2
> {
3
>   doSth();
4
>   threadRuns = false;
5
> }
6
> 
7
> void Funktion()
8
> {
9
>   std::thread clientConnectThread(thread);
10
> 
11
>   while(!threadRuns)
12
>   {
13
> 
14
>   }
15
> 
16
>   return 0;  //Hier bricht das Programm ab
17
> }
Die Funktion ist void, da kommt kein return 0 hin. Wenn dann überhaupt 
nur ein return um die Funktion zu verlassen.

Wird threadRuns eigentlich mal auf true gesetzt?

von bugs galore (Gast)


Lesenswert?

Deine while-Schleife wird kein einziges Mal durchlaufen. Funktion() 
springt also direkt nach dem Erstellen des Thread-Objekts zur 
return-Anweisung (die übrigens 0 zurückliefert, obwohl der Rückgabewert 
void ist!) und ruft somit sofort den Destruktor des Thread-Objekts auf. 
Klar, dass dem Thread das nicht sonderlich gefällt.

Insgesamt sieht deine ganze Programmstruktur nicht sonderlich 
vertrauenserweckend aus. Ein paar Grundlagen zum korrekten Umgang mit 
std::thread solltest du dir schon anlesen, sonst baust du am Ende nur 
haufenweise Bugs ein, die kaum noch nachvollziehbar sein werden.

von GNU (Gast)


Lesenswert?

Problem mit detach() gelöst, war wohl vorhin noch zu früh. Trotzdem 
vielen Dank.

von Peter II (Gast)


Lesenswert?

Threads werden nicht sofort gestartet, nach dem Aufruf von
1
std::thread clientConnectThread(thread);

gibt es zwar den Thread, er muss aber noch keinen code ausgeführt haben.
damit ist threadRuns noch false wenn du den abfrage machst.

Du müsstest mit einer 2.Variable erst prüfen ob die Thread wirklich 
läuft.

von Rolf M. (rmagnus)


Lesenswert?

Übrigens fehlt hier die Synchronistation.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

GNU schrieb:
> Weiß jemand was?

Wenn Du wirklich einfach nur darauf warten willst, dass der Thread sich 
beendet hat, dann solltest Du einfach join() verwenden. Detached threads 
sind selten eine gute Idee. Beschreib doch einfach mal das zu lösende 
Problem.

mfg Torsten

von Mark B. (markbrandis)


Lesenswert?

Torsten Robitzki schrieb:
> Beschreib doch einfach mal das zu lösende Problem.

Und täglich grüßt das Murmeltier. ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.