Qu'est-ce qui fait qu'une pthread est morte?
-
02-07-2019 - |
Question
Je travaille avec un programme multi-thread (utilisant pthreads) qui crée actuellement un thread en arrière-plan (PTHREAD_DETACHED), puis appelle pthread_exit (0). Mon problème est que le processus est alors répertorié comme "obsolète". et curieusement, ne semble pas "exister vraiment" dans / proc (qui défait mes stratégies de débogage)
Je souhaite que les conditions suivantes soient remplies:
- le programme doit exécuter la fonction A dans une boucle et la fonction B une fois
- étant donné le PID du programme / proc / $ pid / exe, / proc / $ pid / maps et / proc / $ pid / fd doivent être accessibles (lorsque le processus est désactivé, ce sont tous des liens vides ou non valides)
- il doit être possible de suspendre / interrompre le programme avec CTRL + C et CTRL + Z comme d'habitude
edit: J'hésite à changer l'interface du programme pour que A soit dans le menu "main". thread et B dans un thread engendré (ils sont actuellement dans l'autre sens). Cela résoudrait-il le problème?
La solution
Vous pouvez suspendre l'exécution du processus principal en attente d'un signal ou ne pas détacher le fil (en utilisant la valeur par défaut PHTREAD_CRATE_JOINABLE ) en attendant sa fin avec un pthread_join ().
.
Autres conseils
Y a-t-il une raison pour laquelle vous ne pouvez pas faire les choses dans l'autre sens: laisser le thread principal exécuter la boucle et effectuer la tâche ponctuelle dans le thread d'arrière-plan?
Ce n'est pas le design le plus élégant, mais vous pourriez peut-être bloquer le thread principal avant de quitter avec:
while(1) {
pause();
}
Ensuite, vous pouvez installer un gestionnaire de signal pour SIGINT et SIGTERM qui rompt la boucle. Le moyen le plus simple est: exit (0): -).