Considérons le code suivant :
do
{
code_retour = nanosleep(&temporisation, &temporisation);
erreur = errno;
...
...
} while((code_retour == -1) && (erreur == EINTR));
Je simplifie. J'interromps nanosleep() grâce à un SIGINT (ctrl +C) et
je vois le gestionnaire se lancer (j'ai collé un printf() dans le
gestionnaire en question). Sous NetBSD, le gestionnaire de signal
est lancé dans un thread spécifique (et non le thread de
l'appelant). Ãa ne semble pas être en contradiction avec les s pecs
POSIX. Mais nanosleep() sort avec un code d'erreur EINTR _avant_ que
le signal soit effectivement traité. Or dans la suite des
instructions de la boucle se trouve un test sur une variable volatile
et atomique positionnée par ce gestionnaire de signal. La plupart du
temps, ce test échoue car le gestionnaire de signal s'exécutan t dans
un autre thread n'a pas encore positionné la variable à la bon ne
valeur.
D'où une série de questions ;-)
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Considérons le code suivant :
do
{
code_retour = nanosleep(&temporisation, &temporisation);
erreur = errno;
...
...
} while((code_retour == -1) && (erreur == EINTR));
Je simplifie. J'interromps nanosleep() grâce à un SIGINT (ctrl +C) et
je vois le gestionnaire se lancer (j'ai collé un printf() dans le
gestionnaire en question). Sous NetBSD, le gestionnaire de signal
est lancé dans un thread spécifique (et non le thread de
l'appelant). Ãa ne semble pas être en contradiction avec les s pecs
POSIX. Mais nanosleep() sort avec un code d'erreur EINTR _avant_ que
le signal soit effectivement traité. Or dans la suite des
instructions de la boucle se trouve un test sur une variable volatile
et atomique positionnée par ce gestionnaire de signal. La plupart du
temps, ce test échoue car le gestionnaire de signal s'exécutan t dans
un autre thread n'a pas encore positionné la variable à la bon ne
valeur.
D'où une série de questions ;-)
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Considérons le code suivant :
do
{
code_retour = nanosleep(&temporisation, &temporisation);
erreur = errno;
...
...
} while((code_retour == -1) && (erreur == EINTR));
Je simplifie. J'interromps nanosleep() grâce à un SIGINT (ctrl +C) et
je vois le gestionnaire se lancer (j'ai collé un printf() dans le
gestionnaire en question). Sous NetBSD, le gestionnaire de signal
est lancé dans un thread spécifique (et non le thread de
l'appelant). Ãa ne semble pas être en contradiction avec les s pecs
POSIX. Mais nanosleep() sort avec un code d'erreur EINTR _avant_ que
le signal soit effectivement traité. Or dans la suite des
instructions de la boucle se trouve un test sur une variable volatile
et atomique positionnée par ce gestionnaire de signal. La plupart du
temps, ce test échoue car le gestionnaire de signal s'exécutan t dans
un autre thread n'a pas encore positionné la variable à la bon ne
valeur.
D'où une série de questions ;-)
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Bonjour à tous,
J'ai un petit doute sur la gestion des signaux POSIX installés grâce
à sigaction(). J'ai accès à un certain nombre d'Unix dont Linux,
Tru64, Solaris, NetBSD, OpenBSD et FreeBSD. Et NetBSD me pose un
petit problème. Je n'arrive pas à savoir s'il s'agit d'un problème
dans mon code ou d'u truc qui m'aurait échappé.
Considérons le code suivant :
do
{
code_retour = nanosleep(&temporisation, &temporisation);
erreur = errno;
...
...
} while((code_retour == -1) && (erreur == EINTR));
Je simplifie. J'interromps nanosleep() grâce à un SIGINT (ctrl+C) et
je vois le gestionnaire se lancer (j'ai collé un printf() dans le
gestionnaire en question). Sous NetBSD, le gestionnaire de signal
est lancé dans un thread spécifique (et non le thread de
l'appelant). Ça ne semble pas être en contradiction avec les specs
POSIX. Mais nanosleep() sort avec un code d'erreur EINTR _avant_ que
le signal soit effectivement traité. Or dans la suite des
instructions de la boucle se trouve un test sur une variable volatile
et atomique positionnée par ce gestionnaire de signal. La plupart du
temps, ce test échoue car le gestionnaire de signal s'exécutant dans
un autre thread n'a pas encore positionné la variable à la bonne
valeur.
D'où une série de questions ;-)
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Merci de votre attention,
JKB
PS: Nicolas George, pas la peine de répondre, je t'ai plonké depuis
longtemps.
Bonjour à tous,
J'ai un petit doute sur la gestion des signaux POSIX installés grâce
à sigaction(). J'ai accès à un certain nombre d'Unix dont Linux,
Tru64, Solaris, NetBSD, OpenBSD et FreeBSD. Et NetBSD me pose un
petit problème. Je n'arrive pas à savoir s'il s'agit d'un problème
dans mon code ou d'u truc qui m'aurait échappé.
Considérons le code suivant :
do
{
code_retour = nanosleep(&temporisation, &temporisation);
erreur = errno;
...
...
} while((code_retour == -1) && (erreur == EINTR));
Je simplifie. J'interromps nanosleep() grâce à un SIGINT (ctrl+C) et
je vois le gestionnaire se lancer (j'ai collé un printf() dans le
gestionnaire en question). Sous NetBSD, le gestionnaire de signal
est lancé dans un thread spécifique (et non le thread de
l'appelant). Ça ne semble pas être en contradiction avec les specs
POSIX. Mais nanosleep() sort avec un code d'erreur EINTR _avant_ que
le signal soit effectivement traité. Or dans la suite des
instructions de la boucle se trouve un test sur une variable volatile
et atomique positionnée par ce gestionnaire de signal. La plupart du
temps, ce test échoue car le gestionnaire de signal s'exécutant dans
un autre thread n'a pas encore positionné la variable à la bonne
valeur.
D'où une série de questions ;-)
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Merci de votre attention,
JKB
PS: Nicolas George, pas la peine de répondre, je t'ai plonké depuis
longtemps.
Bonjour à tous,
J'ai un petit doute sur la gestion des signaux POSIX installés grâce
à sigaction(). J'ai accès à un certain nombre d'Unix dont Linux,
Tru64, Solaris, NetBSD, OpenBSD et FreeBSD. Et NetBSD me pose un
petit problème. Je n'arrive pas à savoir s'il s'agit d'un problème
dans mon code ou d'u truc qui m'aurait échappé.
Considérons le code suivant :
do
{
code_retour = nanosleep(&temporisation, &temporisation);
erreur = errno;
...
...
} while((code_retour == -1) && (erreur == EINTR));
Je simplifie. J'interromps nanosleep() grâce à un SIGINT (ctrl+C) et
je vois le gestionnaire se lancer (j'ai collé un printf() dans le
gestionnaire en question). Sous NetBSD, le gestionnaire de signal
est lancé dans un thread spécifique (et non le thread de
l'appelant). Ça ne semble pas être en contradiction avec les specs
POSIX. Mais nanosleep() sort avec un code d'erreur EINTR _avant_ que
le signal soit effectivement traité. Or dans la suite des
instructions de la boucle se trouve un test sur une variable volatile
et atomique positionnée par ce gestionnaire de signal. La plupart du
temps, ce test échoue car le gestionnaire de signal s'exécutant dans
un autre thread n'a pas encore positionné la variable à la bonne
valeur.
D'où une série de questions ;-)
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Merci de votre attention,
JKB
PS: Nicolas George, pas la peine de répondre, je t'ai plonké depuis
longtemps.
JKB writes:
[...]Considérons le code suivant :
do
{
code_retour = nanosleep(&temporisation, &temporisation);
erreur = errno;
...
...
} while((code_retour == -1) && (erreur == EINTR));
Je simplifie. J'interromps nanosleep() grâce à un SIGINT (ctrl+C) et
je vois le gestionnaire se lancer (j'ai collé un printf() dans le
gestionnaire en question). Sous NetBSD, le gestionnaire de signal
est lancé dans un thread spécifique (et non le thread de
l'appelant). Ça ne semble pas être en contradiction avec les specs
POSIX. Mais nanosleep() sort avec un code d'erreur EINTR _avant_ que
le signal soit effectivement traité. Or dans la suite des
instructions de la boucle se trouve un test sur une variable volatile
et atomique positionnée par ce gestionnaire de signal. La plupart du
temps, ce test échoue car le gestionnaire de signal s'exécutant dans
un autre thread n'a pas encore positionné la variable à la bonne
valeur.
D'où une série de questions ;-)
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
Cela me semble conforme aux threads POSIX. Si tu ne veux pas que le
signal soit traité par un autre thread, il faut le demander via
pthread_sigmask. Sinon, tu risqueras toujours ce que tu observes.2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Bloquer tous les signaux dans les threads qui ne font pas nanosleep().
De toute façon, il n'y a pas moyen d'envoyer un signal à un thread
particulier, donc tu ne peux pas "réveiller" différents nanosleep()
concurrents.
JKB <jkb@koenigsberg.invalid> writes:
[...]
Considérons le code suivant :
do
{
code_retour = nanosleep(&temporisation, &temporisation);
erreur = errno;
...
...
} while((code_retour == -1) && (erreur == EINTR));
Je simplifie. J'interromps nanosleep() grâce à un SIGINT (ctrl+C) et
je vois le gestionnaire se lancer (j'ai collé un printf() dans le
gestionnaire en question). Sous NetBSD, le gestionnaire de signal
est lancé dans un thread spécifique (et non le thread de
l'appelant). Ça ne semble pas être en contradiction avec les specs
POSIX. Mais nanosleep() sort avec un code d'erreur EINTR _avant_ que
le signal soit effectivement traité. Or dans la suite des
instructions de la boucle se trouve un test sur une variable volatile
et atomique positionnée par ce gestionnaire de signal. La plupart du
temps, ce test échoue car le gestionnaire de signal s'exécutant dans
un autre thread n'a pas encore positionné la variable à la bonne
valeur.
D'où une série de questions ;-)
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
Cela me semble conforme aux threads POSIX. Si tu ne veux pas que le
signal soit traité par un autre thread, il faut le demander via
pthread_sigmask. Sinon, tu risqueras toujours ce que tu observes.
2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Bloquer tous les signaux dans les threads qui ne font pas nanosleep().
De toute façon, il n'y a pas moyen d'envoyer un signal à un thread
particulier, donc tu ne peux pas "réveiller" différents nanosleep()
concurrents.
JKB writes:
[...]Considérons le code suivant :
do
{
code_retour = nanosleep(&temporisation, &temporisation);
erreur = errno;
...
...
} while((code_retour == -1) && (erreur == EINTR));
Je simplifie. J'interromps nanosleep() grâce à un SIGINT (ctrl+C) et
je vois le gestionnaire se lancer (j'ai collé un printf() dans le
gestionnaire en question). Sous NetBSD, le gestionnaire de signal
est lancé dans un thread spécifique (et non le thread de
l'appelant). Ça ne semble pas être en contradiction avec les specs
POSIX. Mais nanosleep() sort avec un code d'erreur EINTR _avant_ que
le signal soit effectivement traité. Or dans la suite des
instructions de la boucle se trouve un test sur une variable volatile
et atomique positionnée par ce gestionnaire de signal. La plupart du
temps, ce test échoue car le gestionnaire de signal s'exécutant dans
un autre thread n'a pas encore positionné la variable à la bonne
valeur.
D'où une série de questions ;-)
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
Cela me semble conforme aux threads POSIX. Si tu ne veux pas que le
signal soit traité par un autre thread, il faut le demander via
pthread_sigmask. Sinon, tu risqueras toujours ce que tu observes.2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Bloquer tous les signaux dans les threads qui ne font pas nanosleep().
De toute façon, il n'y a pas moyen d'envoyer un signal à un thread
particulier, donc tu ne peux pas "réveiller" différents nanosleep()
concurrents.
Plus loin on explique que l'usage des sémaphores est en effet le moyen
le plus simple pour résoudre ce genre de problème.
Although mutexes and condition variables provide an ideal solution to
most synchronization needs, they cannot meet all needs. One example of
this is a need to communicate between a POSIX signal-catching function
and a thread waiting for some asynchronous event. In new code, it is
best to use sigwait or sigwait-info rather than relying on a
signal-catching function, and this neatly avoids this problem. However,
the use of asynchronous POSIX signal-catching functions is well
established and widespread, and most programmers working with threads
and existing code will probably encounter this situation.
Avec bien entendu des exemples détaillés d'utilisation.
Plus loin on explique que l'usage des sémaphores est en effet le moyen
le plus simple pour résoudre ce genre de problème.
Although mutexes and condition variables provide an ideal solution to
most synchronization needs, they cannot meet all needs. One example of
this is a need to communicate between a POSIX signal-catching function
and a thread waiting for some asynchronous event. In new code, it is
best to use sigwait or sigwait-info rather than relying on a
signal-catching function, and this neatly avoids this problem. However,
the use of asynchronous POSIX signal-catching functions is well
established and widespread, and most programmers working with threads
and existing code will probably encounter this situation.
Avec bien entendu des exemples détaillés d'utilisation.
Plus loin on explique que l'usage des sémaphores est en effet le moyen
le plus simple pour résoudre ce genre de problème.
Although mutexes and condition variables provide an ideal solution to
most synchronization needs, they cannot meet all needs. One example of
this is a need to communicate between a POSIX signal-catching function
and a thread waiting for some asynchronous event. In new code, it is
best to use sigwait or sigwait-info rather than relying on a
signal-catching function, and this neatly avoids this problem. However,
the use of asynchronous POSIX signal-catching functions is well
established and widespread, and most programmers working with threads
and existing code will probably encounter this situation.
Avec bien entendu des exemples détaillés d'utilisation.
La question est donc de savoir si c'est conforme aux specs POSIX
et comment le contourner simplement parce qu'entre nous, la seule
fonction asyc safe là-dedans est si ma mémoire est bonne sem_post().
Ni les mutrexes, ni sem_wait() ne peuvent être utilisées...
JKB
La question est donc de savoir si c'est conforme aux specs POSIX
et comment le contourner simplement parce qu'entre nous, la seule
fonction asyc safe là-dedans est si ma mémoire est bonne sem_post().
Ni les mutrexes, ni sem_wait() ne peuvent être utilisées...
JKB
La question est donc de savoir si c'est conforme aux specs POSIX
et comment le contourner simplement parce qu'entre nous, la seule
fonction asyc safe là-dedans est si ma mémoire est bonne sem_post().
Ni les mutrexes, ni sem_wait() ne peuvent être utilisées...
JKB
JKB wrote:
La question est donc de savoir si c'est conforme aux specs POSIX
et comment le contourner simplement parce qu'entre nous, la seule
fonction asyc safe là-dedans est si ma mémoire est bonne sem_post().
Ni les mutrexes, ni sem_wait() ne peuvent être utilisées...
Je ne vais surement pas perdre mon temps à essayer de décrypter des
specs parfaitement imbaisables. Pour la programmation des threads
"posix" il y a une référence et une seule, Butenhof (mec qui a participé
à la rédaction de la spec, donc en connait parfaitement
l'interprétation). Il commence son chapitre en disant qu'il faut éviter
autant que possible l'utilisation conjointe des threads et des signaux,
ce que tout le monde se tue à te dire.
Si néanmoins on persiste, il dit
qu'il faut utiliser des sémaphores pour se dépatouiller et donne un
exemple. Les choses que tu observes sur tel ou tel système marchent par
hasard, c'est tout.
Utiliser des sémaphores c'est merdique, pour
d'autres raisons, c'est tout le temps un truc à problèmes. Par exemple
ça a du mal à tourner dans une jail de freebsd. Donc la vraie solution
c'est d'utiliser uniquement des techniques de pthreads (variables de
condition, etc.) et ne pas envoyer de signaux. Tu le sais dès le début.
Pour la n° fois je te file la référence de Butenhof
http://lib.org.by/info/Cs_Computer%20science/CsPl_Programming%20languages/Butenhof.%20Programming%20with%20POSIX%20threads%20(AW,%201997)(T)(ISBN%200201633922)(398s).djvu
JKB <jkb@koenigsberg.invalid> wrote:
La question est donc de savoir si c'est conforme aux specs POSIX
et comment le contourner simplement parce qu'entre nous, la seule
fonction asyc safe là-dedans est si ma mémoire est bonne sem_post().
Ni les mutrexes, ni sem_wait() ne peuvent être utilisées...
Je ne vais surement pas perdre mon temps à essayer de décrypter des
specs parfaitement imbaisables. Pour la programmation des threads
"posix" il y a une référence et une seule, Butenhof (mec qui a participé
à la rédaction de la spec, donc en connait parfaitement
l'interprétation). Il commence son chapitre en disant qu'il faut éviter
autant que possible l'utilisation conjointe des threads et des signaux,
ce que tout le monde se tue à te dire.
Si néanmoins on persiste, il dit
qu'il faut utiliser des sémaphores pour se dépatouiller et donne un
exemple. Les choses que tu observes sur tel ou tel système marchent par
hasard, c'est tout.
Utiliser des sémaphores c'est merdique, pour
d'autres raisons, c'est tout le temps un truc à problèmes. Par exemple
ça a du mal à tourner dans une jail de freebsd. Donc la vraie solution
c'est d'utiliser uniquement des techniques de pthreads (variables de
condition, etc.) et ne pas envoyer de signaux. Tu le sais dès le début.
Pour la n° fois je te file la référence de Butenhof
http://lib.org.by/info/Cs_Computer%20science/CsPl_Programming%20languages/Butenhof.%20Programming%20with%20POSIX%20threads%20(AW,%201997)(T)(ISBN%200201633922)(398s).djvu
JKB wrote:
La question est donc de savoir si c'est conforme aux specs POSIX
et comment le contourner simplement parce qu'entre nous, la seule
fonction asyc safe là-dedans est si ma mémoire est bonne sem_post().
Ni les mutrexes, ni sem_wait() ne peuvent être utilisées...
Je ne vais surement pas perdre mon temps à essayer de décrypter des
specs parfaitement imbaisables. Pour la programmation des threads
"posix" il y a une référence et une seule, Butenhof (mec qui a participé
à la rédaction de la spec, donc en connait parfaitement
l'interprétation). Il commence son chapitre en disant qu'il faut éviter
autant que possible l'utilisation conjointe des threads et des signaux,
ce que tout le monde se tue à te dire.
Si néanmoins on persiste, il dit
qu'il faut utiliser des sémaphores pour se dépatouiller et donne un
exemple. Les choses que tu observes sur tel ou tel système marchent par
hasard, c'est tout.
Utiliser des sémaphores c'est merdique, pour
d'autres raisons, c'est tout le temps un truc à problèmes. Par exemple
ça a du mal à tourner dans une jail de freebsd. Donc la vraie solution
c'est d'utiliser uniquement des techniques de pthreads (variables de
condition, etc.) et ne pas envoyer de signaux. Tu le sais dès le début.
Pour la n° fois je te file la référence de Butenhof
http://lib.org.by/info/Cs_Computer%20science/CsPl_Programming%20languages/Butenhof.%20Programming%20with%20POSIX%20threads%20(AW,%201997)(T)(ISBN%200201633922)(398s).djvu
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
Cela me semble conforme aux threads POSIX. Si tu ne veux pas que le
signal soit traité par un autre thread, il faut le demander via
pthread_sigmask. Sinon, tu risqueras toujours ce que tu observes.2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Bloquer tous les signaux dans les threads qui ne font pas nanosleep().
De toute façon, il n'y a pas moyen d'envoyer un signal à un th read
particulier, donc tu ne peux pas "réveiller" différents nanosl eep()
concurrents.
Mais je ne veux pas bloquer les threads.
NetBSD crée un thread pour appeler le gestionnaire de signal
(même pthread_self() renvoie une valeu différente). Dans un
programme monothread, le fait de recevoir un signal le
transforme un court instant en programme multithreadé parce
qu'en plus le gestionnaire de signal s'exécute de façon
concurrente au programme principal !
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
Cela me semble conforme aux threads POSIX. Si tu ne veux pas que le
signal soit traité par un autre thread, il faut le demander via
pthread_sigmask. Sinon, tu risqueras toujours ce que tu observes.
2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Bloquer tous les signaux dans les threads qui ne font pas nanosleep().
De toute façon, il n'y a pas moyen d'envoyer un signal à un th read
particulier, donc tu ne peux pas "réveiller" différents nanosl eep()
concurrents.
Mais je ne veux pas bloquer les threads.
NetBSD crée un thread pour appeler le gestionnaire de signal
(même pthread_self() renvoie une valeu différente). Dans un
programme monothread, le fait de recevoir un signal le
transforme un court instant en programme multithreadé parce
qu'en plus le gestionnaire de signal s'exécute de façon
concurrente au programme principal !
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
Cela me semble conforme aux threads POSIX. Si tu ne veux pas que le
signal soit traité par un autre thread, il faut le demander via
pthread_sigmask. Sinon, tu risqueras toujours ce que tu observes.2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Bloquer tous les signaux dans les threads qui ne font pas nanosleep().
De toute façon, il n'y a pas moyen d'envoyer un signal à un th read
particulier, donc tu ne peux pas "réveiller" différents nanosl eep()
concurrents.
Mais je ne veux pas bloquer les threads.
NetBSD crée un thread pour appeler le gestionnaire de signal
(même pthread_self() renvoie une valeu différente). Dans un
programme monothread, le fait de recevoir un signal le
transforme un court instant en programme multithreadé parce
qu'en plus le gestionnaire de signal s'exécute de façon
concurrente au programme principal !
JKB writes:
[...]1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
Cela me semble conforme aux threads POSIX. Si tu ne veux pas que le
signal soit traité par un autre thread, il faut le demander via
pthread_sigmask. Sinon, tu risqueras toujours ce que tu observes.2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Bloquer tous les signaux dans les threads qui ne font pas nanosleep().
De toute façon, il n'y a pas moyen d'envoyer un signal à un thread
particulier, donc tu ne peux pas "réveiller" différents nanosleep()
concurrents.
Mais je ne veux pas bloquer les threads.
Je parlais de bloquer les signaux.
NetBSD crée un thread pour appeler le gestionnaire de signal
(même pthread_self() renvoie une valeu différente). Dans un
programme monothread, le fait de recevoir un signal le
transforme un court instant en programme multithreadé parce
qu'en plus le gestionnaire de signal s'exécute de façon
concurrente au programme principal !
Alors là... Honnêtement, c'est un problèmede NetBSD. Si il commence à
lancer des threads sans qu'on lui demande, on peut pas lutter.
JKB <jkb@koenigsberg.invalid> writes:
[...]
1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
Cela me semble conforme aux threads POSIX. Si tu ne veux pas que le
signal soit traité par un autre thread, il faut le demander via
pthread_sigmask. Sinon, tu risqueras toujours ce que tu observes.
2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Bloquer tous les signaux dans les threads qui ne font pas nanosleep().
De toute façon, il n'y a pas moyen d'envoyer un signal à un thread
particulier, donc tu ne peux pas "réveiller" différents nanosleep()
concurrents.
Mais je ne veux pas bloquer les threads.
Je parlais de bloquer les signaux.
NetBSD crée un thread pour appeler le gestionnaire de signal
(même pthread_self() renvoie une valeu différente). Dans un
programme monothread, le fait de recevoir un signal le
transforme un court instant en programme multithreadé parce
qu'en plus le gestionnaire de signal s'exécute de façon
concurrente au programme principal !
Alors là... Honnêtement, c'est un problèmede NetBSD. Si il commence à
lancer des threads sans qu'on lui demande, on peut pas lutter.
JKB writes:
[...]1/ Est-ce un comportement attendu ou un bug de la gestion des
signaux de NetBSD ? Je n'observe ce comportement que sous ce
système.
Cela me semble conforme aux threads POSIX. Si tu ne veux pas que le
signal soit traité par un autre thread, il faut le demander via
pthread_sigmask. Sinon, tu risqueras toujours ce que tu observes.2/ Comment s'assurer de façon propre que le gestionnaire de signal
a terminé ses traitement sans y coller un sem_post() (j'aimerais
éviter) ?
Bloquer tous les signaux dans les threads qui ne font pas nanosleep().
De toute façon, il n'y a pas moyen d'envoyer un signal à un thread
particulier, donc tu ne peux pas "réveiller" différents nanosleep()
concurrents.
Mais je ne veux pas bloquer les threads.
Je parlais de bloquer les signaux.
NetBSD crée un thread pour appeler le gestionnaire de signal
(même pthread_self() renvoie une valeu différente). Dans un
programme monothread, le fait de recevoir un signal le
transforme un court instant en programme multithreadé parce
qu'en plus le gestionnaire de signal s'exécute de façon
concurrente au programme principal !
Alors là... Honnêtement, c'est un problèmede NetBSD. Si il commence à
lancer des threads sans qu'on lui demande, on peut pas lutter.
Donc pas moyen de contourner le truc facilement... Vu le peu de
fonctions async-safe, le workaround s'il existe risque d'être
amusant.
Donc pas moyen de contourner le truc facilement... Vu le peu de
fonctions async-safe, le workaround s'il existe risque d'être
amusant.
Donc pas moyen de contourner le truc facilement... Vu le peu de
fonctions async-safe, le workaround s'il existe risque d'être
amusant.
JKB writes:Donc pas moyen de contourner le truc facilement... Vu le peu de
fonctions async-safe, le workaround s'il existe risque d'être
amusant.
Si tu le trouves, ca m'interesse.
JKB <jkb@koenigsberg.invalid> writes:
Donc pas moyen de contourner le truc facilement... Vu le peu de
fonctions async-safe, le workaround s'il existe risque d'être
amusant.
Si tu le trouves, ca m'interesse.
JKB writes:Donc pas moyen de contourner le truc facilement... Vu le peu de
fonctions async-safe, le workaround s'il existe risque d'être
amusant.
Si tu le trouves, ca m'interesse.