Multithreading pthread_cancel funktioniert nicht?
Hallo,
Ich möchte einen Thread in C++ und Linux "killen" der in einer Endlosschleife hängt. Leider funktioniert pthread_cancel nicht obwohl es mir 0 returned. Sobald ich aber mit pthread_join überprüfe ob der Thread wirklich gelöscht wurde, steckt mein Programm in einer Endlosschleife. Sprich der Cancel Befehl funktioniert nicht.Mir ist bewusst, dass pthread_cancel wenn möglich vermieden werden soll und stattdessen pthread_exit benutzt werden sollte, allerdings verbietet mir das die Uni (offensichtlich wollen die, dass wir uns bad practice einlernen...)
Hier das stark gekürzte CodeSnippet
void *foo()
{
//do sth
while(1)
{
//keep thread running
}
}
int main()
{
pthread_t t1;
pthread_create(&t1, NULL, &foo, NULL);
while(1)
{
//do sth
if(signal_to_kill)
{
pthread_cancel(t1);
pthread_join(t1, NULL);
break;
}
}
return 0;
}
2 Antworten
![](https://images.gutefrage.net/media/user/TechPech1984/1632773764038_nmmslarge__12_0_519_519_b8bdbc8023c4e7722d66db9f2af2d5fd.png?v=1632773764000)
ich glaub das beschreibt es
![](https://images.gutefrage.net/media/default/user/14_nmmslarge.png?v=1551279448000)
Das ist doch alles totaler Pfusch.
Nimm std::thread, fixe den Bug mit der Endlosschleife, und beende den Thread ordnungsgemäß!
Das ist ja grausam bisher ...
![](https://images.gutefrage.net/media/default/user/13_nmmslarge.png?v=1551279448000)
Natürlich ist es ein Pfusch, aber was soll ich machen? Wir dürfen nur pthread verwenden also fällt std::thread schonmal raus. Außerdem dürfen wir die while loop nicht ändern -> Sprich der Thread kann sich weder mit pthread_exit selber beenden noch kann ich einen cancellation point setzen. Die einzige Möglichkeit ist also diesen mit den entsprechenden pthread_setcancelstate und thread_setcanceltype zu canceln (dies war btw mein Fehler, ich hab auf den canceltype vergessen).
![](https://images.gutefrage.net/media/user/Palladin007/1513698609789_nmmslarge__202_0_980_980_9cc06b25d33a80bd7adc221dae634818.jpg?v=1513698610000)
Hätte ich nicht schöner schreiben können :D
Ich bin zwar C#-Entwickler, aber auch da gilt:
Threads werden nicht abgebrochen, die haben sich gefälligst selbst zu beenden.
'ne bool-Variable reicht ja, bei C# muss man da nicht mehr groß synchronisieren.