Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[POSIX] Souci avec pthread_exit() sur threads joignables

12 réponses
Avatar
JKB
Bonsoir à tous,

Je suis en train de chasser un bug sournois avec pthread_exit() dans
un programme POSIX. Il est développé sous Linux mais doit pouvoir
fonctionner sous des BSD.

Ce programme effectue un certain nombre de fork(). Dans chacun des
sous-processus créés par le fork() en question sont lancés deux threads
supplémentaires. Ces deux threads sont dans l'état JOIGNABLE.

Avant de quitter le sous-processus créé, j'attends gentiment que les
threads joignables finissent (il y a un mécanisme d'arrêt). Le
Le fil d'exécution principal (créé par le fork() plus haut) attend
la fin des threads en question grâce à deux appels pthread_join()
avec les références des deux threads créés plus haut.

Or de temps en temps, mon programme entre dans un deadlock lors de
l'appel de pthread_exit(). Les deux pthread_exit() sont en attente
sur le même mutex interne :

(gdb) bt
#0 __lll_lock_wait () at
../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
#1 0x00007fe0c7b93912 in __GI___pthread_mutex_lock (
mutex=0x7fe0c86f6970 <_rtld_global+2352>)
at ../nptl/pthread_mutex_lock.c:115
#2 0x00007fe0c72839df in __GI___dl_iterate_phdr
(callback=0x7fe0c6f60d60,
data=0x7fe0bfffe980) at dl-iteratephdr.c:41
#3 0x00007fe0c6f620b3 in _Unwind_Find_FDE ()
from /lib/x86_64-linux-gnu/libgcc_s.so.1
#4 0x00007fe0c6f5ea76 in ?? () from
/lib/x86_64-linux-gnu/libgcc_s.so.1
#5 0x00007fe0c6f5fcc0 in ?? () from
/lib/x86_64-linux-gnu/libgcc_s.so.1
#6 0x00007fe0c6f602e6 in _Unwind_ForcedUnwind ()
from /lib/x86_64-linux-gnu/libgcc_s.so.1
#7 0x00007fe0c7b99370 in __GI___pthread_unwind
(buf=<optimized out>) at unwind.c:126
#8 0x00007fe0c7b92345 in __do_cancel () at pthreadP.h:283
#9 __pthread_exit (value=value@entry=0x0) at pthread_exit.c:28
...

Je n'arrive pas à savoir si le problème provient de l'ordre des
pthread_exit() bien que je n'ai rien vu sur un éventuel problème
d'ordre. Les pthread_join() sont toujours appelés dans le même sens,
mais je ne maîtrise pas l'ordre des pthread_exit().

Je viens de passer la journée avec valgrind et je puis assurer qu'il
n'y a pas d'utilisation foireuse de pointeurs.

Est-ce que ce genre de problème rappelle quelque chose à quelqu'un ?

J'ai aussi vu dans la doc de pthread_exit() de Linux la remarque
suivante :

BUGS
Currently, there are limitations in the kernel implementation
logic for wait(2)ing on a stopped thread group with a dead thread
group leader. This can manifest in problems such as a locked
terminal if a stop signal is sent to a foreground process
whose thread group leader has already called pthread_exit().

mais je ne vois pas bien si cela correspond à mon problème et si
oui, comment le contourner.

Une idée ?

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
=> http://loubardes.de-charybde-en-scylla.fr

2 réponses

1 2
Avatar
Lucas Levrel
Le 26 juillet 2016, JKB a écrit :
Le Tue, 26 Jul 2016 10:47:56 +0200,
Lucas Levrel écrivait :
Et sur un seul cœur, le bug apparaît aussi ?

Je ne sais pas (et je ne sais pas comment tester).

Sous Linux, en lançant l'exécutable avec les outils cpuset ? Ou depuis le
code, avec pthread_setaffinity_np ?
--
LL
Ἕν οἶδα ὅτι οὐδὲν οἶδα (Σωκράτης)
Avatar
JKB
Le Wed, 27 Jul 2016 12:23:41 +0200,
Lucas Levrel écrivait :
Le 26 juillet 2016, JKB a écrit :
Le Tue, 26 Jul 2016 10:47:56 +0200,
Lucas Levrel écrivait :
Et sur un seul cœur, le bug apparaît aussi ?

Je ne sais pas (et je ne sais pas comment tester).

Sous Linux, en lançant l'exécutable avec les outils cpuset ? Ou depuis le
code, avec pthread_setaffinity_np ?

Je vais regarder ça à l'occasion. Je suis présentement en train de
bissecter le code et je subodore un truc vicieux un peu plus haut,
lorsque je fais un fork() avant de créer les deux threads fautifs.
Je devrais avoir une idée du problème demain.
JKB
--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
=> http://loubardes.de-charybde-en-scylla.fr
1 2