Es tut mir leid, wenn es eine triviale Frage ist, aber ich konnte keine Lösung online finden. Ich habe ein kleines Programm mit wenigen Prozessen, jeder Prozess enthält mehrere Threads.Wie kid Kind Themen aus dem übergeordneten Thread - C
Wenn der Elternprozess eine bestimmte Nachricht erhält, soll er alle seine Unterthreads beenden und alle Mutexe zerstören. Das Problem ist, dass einige dieser Threads blockiert werden können (beim I/O-Befehl) und daher kein Signal oder keine Nachricht empfangen können, um ihre Prozeduren zu beenden.
Ich dachte über pthread_cancel
verwenden und die cancel routine
außer Kraft setzen, aber das Problem ist, dass einige mutexes erschienen gesperrt werden, wenn die cancel signal
gesendet wird, und somit nicht zerstört werden können.
Die Verwendung von pthread_kill
hat auch nicht funktioniert, weil es den gesamten Prozess beendet und somit nicht verwendet werden kann, wenn ich einen sauberen Ausgang haben möchte.
Wie kann ein Prozess seine Kind-Threads töten und die Mutexe auf saubere Weise zerstören?
Der entsprechende Abschnitt des Codes sieht aus, als so etwas wie:
ret = fork()
if(ret > 0)
{
pthread_t th1, th2;
my_pthread_create(&th1,threadFunction1,NULL);
my_pthread_create(&th2,threadFunction2,NULL);
if(msgrcv(qid1,&msg,MSG_SIZE,0,0) < 0)
perror("msgrcv failed...\n");
else
//print some information from the global variables, terminate
//threads and destroy mutexes
}
else if(ret<0)
perror("fork failed...\n");
else
....
Jede Hilfe wird sehr geschätzt werden!
Danke
Während [diese Frage] (https://stackoverflow.com/questions/14268080/cancelling-a-thread-that-has-a-mutex-locked-does-not-unlock-the-mutex) ist für C++ , es und seine angenommene Antwort sollten nützlich sein, denke ich. –
"* Wie kann ein Prozess seine untergeordneten Threads [...] sauber löschen *" Ich würde sagen, das ist per Definition nicht möglich, da das Abbrechen eines Threads nur "schmutzig" ist. Tun Sie dies nicht, es könnte zu unerwarteten Nebenwirkungen führen. Ein sauberer Weg wäre die Verwendung eines Flags, das vom übergeordneten Thread gesetzt und von den Kindern gelesen wird. Wenn die Flagge gesetzt ist, beenden sich die Kinder einfach. Wenn ein Thread während eines Systemaufrufs blockiert wird, senden Sie dem Thread ein Signal, um den Systemaufruf zu unterbrechen, in dem er festsitzt. – alk