Cancel a thread
#include <sys/neutrino.h> int ThreadCancel( int tid, void (*canstub)(void) ); int ThreadCancel_r( int tid, void (*canstub)(void) );
|You must provide a canstub function.|
Use the -l c option to qcc to link against this library. This library is usually included automatically.
These kernel calls request that the thread specified by tid be canceled. The target thread's cancelability state and type determine when the cancellation takes effect.
The ThreadCancel() and ThreadCancel_r() functions are identical, except in the way they indicate errors. See the Returns section for details.
|Instead of using these kernel calls directly, consider calling pthread_cancel().|
When the cancellation is acted upon, the thread jumps to the location specified by canstub. This stub should call cancellation cleanup handlers for the thread. When the last cancellation cleanup handler returns, the stub must terminate the thread using:
ThreadDestroy( 0, -1, PTHREAD_CANCEL);
Unlike ThreadDestroy(), which destroys a thread immediately, ThreadCancel() requests that the target thread execute any cleanup code and then terminate at its earliest convenience.
The cancellation processing in the target thread runs asynchronously with respect to the calling thread, which doesn't block.
The combinations of cancelability state and type are as follows:
|Disabled||Deferred||Cancel requests are made pending|
|Disabled||Async||Cancel requests are made pending|
|Enabled||Deferred||Cancellation happens at the next cancellation point. These are at explicitly coded calls to pthread_testcancel() or an attempt to enter a blocking state in certain calls (see below). All kernel calls that block are cancellation points, with the exception of MsgSendvnc() and SyncMutexLock().|
|Enabled||Async||Cancellation happens immediately.|
Use pthread_setcancelstate(), and pthread_setcanceltype() to set the state and type.
POSIX defines a list of functions that are cancellation points; some functions that aren't listed there may also be cancellation points. For a full list, see “Cancellation points” in the appendix, Summary of Safety Information. Any function that calls a blocking kernel call that's a cancellation point will itself become a cancellation point when the kernel call is made. The most common blocking kernel call in library code is MsgSendv().
These calls don't block.
The only difference between these functions is the way they indicate errors:
pthread_cancel(), pthread_setcancelstate(), pthread_setcanceltype(), pthread_testcancel(), ThreadCreate(), ThreadDestroy()