Man page - pthread_cancel(3)

Packages contains this manual

Available languages:

en fr ja ro

Manual

pthread_cancel

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
ATTRIBUTS
VERSIONS
STANDARDS
HISTORIQUE
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

pthread_cancel — Envoyer une requĂȘte d’annulation Ă  un thread

BIBLIOTHÈQUE

BibliothĂšque de threads POSIX ( libpthread , -lpthread )

SYNOPSIS

#include <pthread.h>

int pthread_cancel(pthread_t thread );

DESCRIPTION

La fonction pthread_cancel () envoie une requĂȘte d’annulation au thread thread . Si et quand le thread ciblĂ© rĂ©agit Ă  la requĂȘte d’annulation dĂ©pend de deux attributs qui sont sous le contrĂŽle de ce thread : son Ă©tat d’annulation ( state ) et son mode d’annulation ( type ).

L’état d’annulation d’un thread, dĂ©terminĂ© par pthread_setcancelstate (3), peut ĂȘtre activĂ© ( enabled ), c’est le dĂ©faut pour les nouveaux threads, ou dĂ©sactivĂ© ( disabled ). Si un thread dĂ©sactive l’annulation, alors une demande d’annulation restera dans la file d’attente jusqu’à ce que le thread active l’annulation. Si un thread active l’annulation, alors son mode d’annulation va dĂ©terminer le moment oĂč cette annulation est effectuĂ©e.

Le mode d’annulation d’un thread, dĂ©terminĂ© par pthread_setcanceltype (3), peut ĂȘtre asynchrone ( asynchronous ) ou retardĂ©e ( deferred ), qui est le mode par dĂ©faut pour les nouveaux threads. Un mode d’annulation asynchrone signifie que le thread peut ĂȘtre annulĂ© Ă  tout moment (d’ordinaire immĂ©diatement, mais ce n’est pas garanti). Un mode d’annulation retardĂ© signifie que l’annulation peut ĂȘtre retardĂ©e jusqu’à ce que le thread appelle une fonction qui est un point d’annulation ( cancellation point ). Une liste des fonctions qui sont ou peuvent ĂȘtre des points d’annulation est donnĂ©e dans pthreads (7).

Quand une requĂȘte d’annulation est traitĂ©e, les Ă©tapes suivantes sont effectuĂ©es pour thread (dans cet ordre) :

(1)

Les gestionnaires de nettoyage sont dĂ©pilĂ©s (dans l’ordre inverse dans lequel ils ont Ă©tĂ© empilĂ©s) et appelĂ©s (consultez pthread_cleanup_push (3)).

(2)

Les destructeurs de données spécifiques aux threads sont appelés, dans un ordre non déterminé (consultez pthread_key_create (3)).

(3)

Le thread s’est terminĂ© (consultez pthread_exit (3)).

Les Ă©tapes ci-dessus sont effectuĂ©es de maniĂšre asynchrone par rapport Ă  l’appel Ă  pthread_cancel (). La valeur de retour de pthread_cancel () ne fait qu’informer l’appelant si une requĂȘte d’annulation a Ă©tĂ© correctement mise en file d’attente.

AprĂšs qu’un thread annulĂ© s’est terminĂ©, une demande de jointure par pthread_join (3) renvoie PTHREAD_CANCELED comme Ă©tat de sortie du thread. Il faut noter que joindre un thread est la seule maniĂšre de savoir si une annulation a terminĂ©.

VALEUR RENVOYÉE

En cas de rĂ©ussite, pthread_cancel () renvoie 0 ; en cas d’erreur, elle renvoie un numĂ©ro d’erreur non nul.

ERREURS

ESRCH

Aucun fil d’exĂ©cution avec pour identifiant thread n’a pu ĂȘtre trouvĂ©.

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3864934-1.png

VERSIONS

Sous Linux, l’annulation est implĂ©mentĂ©e par des signaux. Avec l’implĂ©mentation NPTL, le premier signal temps-rĂ©el (c’est-Ă -dire le signal 32) est utilisĂ© dans ce but. Avec LinuxThreads, le second signal temps-rĂ©el est utilisĂ©, si les signaux temps-rĂ©els sont disponibles, sinon SIGUSR2 est utilisĂ© Ă  la place.

STANDARDS

POSIX.1-2008.

HISTORIQUE

glibc 2.0 POSIX.1-2001.

EXEMPLES

Le programme ci-dessous crĂ©e un thread puis l’annule. Le thread principal joint le thread annulĂ© pour vĂ©rifier que son Ă©tat de sortie Ă©tait bien PTHREAD_CANCELED . La session suivante montre un exemple d’exĂ©cution :

$ ./a.out
thread_func(): démarré ; annulation désactivée
main(): envoi d’une requĂȘte d’annulation
thread_func(): sur le point d’activer l’annulation
main(): le thread a été annulé

Source du programme

#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
static void *
thread_func(void *ignored_argument)
{
int s;
/* DĂ©sactiver l’annulation pendant un certain temps, pour
Ă©viter une rĂ©action immĂ©diate Ă  une requĂȘte d’annulation. */
s = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
if (s != 0)
handle_error_en(s, "pthread_setcancelstate");
printf("%s() : démarré ; annulation désactivée\n", __func__);
sleep(5);
printf("%s() : sur le point d’activer l’annulation\n", __func__);
s = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
if (s != 0)
handle_error_en(s, "pthread_setcancelstate");
/* sleep() est un point d’annulation. */
sleep(1000); /* Devrait ĂȘtre annulĂ© pendant la pĂ©riode de sommeil */
/* Cela ne devrait jamais se produire. */
printf("%s() : pas annulé !\n", __func__);
return NULL;
}
int
main(void)
{
pthread_t thr;
void *res;
int s;
/* DĂ©marrer un thread et lui envoyer une requĂȘte d’annulation. */
s = pthread_create(&thr, NULL, &thread_func, NULL);
if (s != 0)
handle_error_en(s, "pthread_create");
sleep(2); /* Donner au thread l’occasion de dĂ©marrer */
printf("%s() : envoi d’une requĂȘte d’annulation\n", __func__);
s = pthread_cancel(thr);
if (s != 0)
handle_error_en(s, "pthread_cancel");
/* Joindre le thread pour vérifier son état de sortie. */
s = pthread_join(thr, &res);
if (s != 0)
handle_error_en(s, "pthread_join");
if (res == PTHREAD_CANCELED)
printf("%s() : le thread a été annulé\n", __func__);
else
printf("%s() : le thread n’a pas Ă©tĂ© annulĂ© (cela ne devrait pas arriver !)\n",
__func__);
exit(EXIT_SUCCESS);
}

VOIR AUSSI

pthread_cleanup_push (3), pthread_create (3), pthread_exit (3), pthread_join (3), pthread_key_create (3), pthread_setcancelstate (3), pthread_setcanceltype (3), pthread_testcancel (3), pthreads (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .