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
ich glaub das beschreibt es
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 ...
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.
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).