Computer Science
PTHREAD_CANCEL(3) PTHREAD_CANCEL(3)
NAME
pthread_cancel, pthread_setcancelstate, pthread_setcancel-
type, pthread_testcancel - thread cancellation
SYNOPSIS
#include <pthread.h>
int pthread_cancel(pthread_t thread);
int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
void pthread_testcancel(void);
DESCRIPTION
Cancellation is the mechanism by which a thread can termi-
nate the execution of another thread. More precisely, a
thread can send a cancellation request to another thread.
Depending on its settings, the target thread can then
either ignore the request, honor it immediately, or defer
it till it reaches a cancellation point.
When a thread eventually honors a cancellation request, it
performs as if pthread_exit(PTHREAD_CANCELED) has been
called at that point: all cleanup handlers are executed in
reverse order, finalization functions for thread-specific
data are called, and finally the thread stops executing
with the return value PTHREAD_CANCELED. See
pthread_exit(3) for more information.
pthread_cancel sends a cancellation request to the thread
denoted by the thread argument.
pthread_setcancelstate changes the cancellation state for
the calling thread -- that is, whether cancellation
requests are ignored or not. The state argument is the new
cancellation state: either PTHREAD_CANCEL_ENABLE to enable
cancellation, or PTHREAD_CANCEL_DISABLE to disable cancel-
lation (cancellation requests are ignored). If oldstate is
not NULL, the previous cancellation state is stored in the
location pointed to by oldstate, and can thus be restored
later by another call to pthread_setcancelstate.
pthread_setcanceltype changes the type of responses to
cancellation requests for the calling thread: asynchronous
(immediate) or deferred. The type argument is the new
cancellation type: either PTHREAD_CANCEL_ASYNCHRONOUS to
cancel the calling thread as soon as the cancellation
request is received, or PTHREAD_CANCEL_DEFERRED to keep
the cancellation request pending until the next cancella-
tion point. If oldtype is not NULL, the previous cancella-
tion state is stored in the location pointed to by old-
type, and can thus be restored later by another call to
pthread_setcanceltype.
Threads are always created by pthread_create(3) with can-
cellation enabled and deferred. That is, the initial can-
cellation state is PTHREAD_CANCEL_ENABLE and the initial
type is PTHREAD_CANCEL_DEFERRED.
Cancellation points are those points in the program execu-
tion where a test for pending cancellation requests is
performed and cancellation is executed if positive. The
following POSIX threads functions are cancellation points:
pthread_join(3)
pthread_cond_wait(3)
pthread_cond_timedwait(3)
pthread_testcancel(3)
sem_wait(3)
sigwait(3)
All other POSIX threads functions are guaranteed not to be
cancellation points. That is, they never perform cancella-
tion in deferred cancellation mode.
pthread_testcancel does nothing except testing for pending
cancellation and executing it. Its purpose is to introduce
explicit checks for cancellation in long sequences of code
that do not call cancellation point functions otherwise.
RETURN VALUE
pthread_cancel, pthread_setcancelstate and pthread_set-
canceltype return 0 on success and a non-zero error code
on error.
ERRORS
pthread_cancel returns the following error code on error:
ESRCH no thread could be found corresponding to
that specified by the thread ID.
pthread_setcancelstate returns the following error code on
error:
EINVAL the state argument is not PTHREAD_CAN-
CEL_ENABLE nor PTHREAD_CANCEL_DISABLE
pthread_setcanceltype returns the following error code on
error:
EINVAL the type argument is not PTHREAD_CAN-
CEL_DEFERRED nor PTHREAD_CANCEL_ASYNCHRONOUS
AUTHOR
Xavier Leroy <Xavier.Leroy@inria.fr>
SEE ALSO
pthread_exit(3), pthread_cleanup_push(3),
pthread_cleanup_pop(3).
BUGS
POSIX specifies that a number of system calls (basically,
all system calls that may block, such as read(2),
write(2), wait(2), etc.) and library functions that may
call these system calls (e.g. fprintf(3)) are cancella-
tion points. LinuxThreads is not yet integrated enough
with the C library to implement this, and thus none of the
C library functions is a cancellation point.
For system calls at least, there is a workaround. Cancel-
lation requests are transmitted to the target thread by
sending it a signal. That signal will interrupt all block-
ing system calls, causing them to return immediately with
the EINTR error. So, checking for cancellation during a
read system call, for instance, can be achieved as fol-
lows:
pthread_testcancel();
retcode = read(fd, buffer, length);
pthread_testcancel();
LinuxThreads 1
Back to the index