c++ Thread schießt das ganze Programm ab

Gast #4122944
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?
Gast #4122948
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?
Gast #4122949
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.
Gast #4123039
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren