2017-06-09 3 views
2

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

+1

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. –

+0

"* 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

Antwort

2

scoped_lock

ist eine der besten Optionen, die Sie mit gehen kann, das automatisch den Mutex freigeben würde, wenn die Programmausführung den Gültigkeitsbereich verlässt.

Mit dem sagte ich würde nicht empfehlen, die Threads in einer Produktion bereit Code zu töten, es sei denn, es ist wirklich notwendig, und es gibt keine andere Option zu gehen, können Sie auch Signalisierungsmechanismen verwenden, um die Threads zu benachrichtigen, um selbst sterben würde vermeide viele Probleme. Sagen Sie zum Beispiel, Sie können eine Wartefunktion in einem Thread für ein bestimmtes Signal haben und den Thread beenden, sobald Sie das gleiche erhalten.

Verwandte Themen