When we want to terminate a thread, we can use the
pthread_cancel
function. This function gets a thread ID as a parameter, and sends a cancellation request to this thread.pthread_cancel(thr_id);
The
pthread_cancel()
function returns 0, so we cannot know if it succeeded or not.Setting Thread Cleanup Functions
One of the features the pthreads library supplies is the ability for a thread to clean up after itself, before it exits. This is done by specifying one or more functions that will be called automatically by the pthreads library when the thread exits, either due to its own will (e.g. calling
pthread_exit()
), or due to it being canceled.
Two functions are supplied for this purpose. The
pthread_cleanup_push()
function is used to add a cleanup function to the set of cleanup functions for the current thread. The pthread_cleanup_pop()
function removes the last function added with pthread_cleanup_push()
. When the thread terminates, its cleanup functions are called in the reverse order of their registration. So the the last one to be registered is the first one to be called.Synchronizing On Threads Exiting
Sometimes it is desired for a thread to wait for the end of execution of another thread. This can be done using thepthread_join()
function.The
pthread_join()
function suspends the execution of the calling thread until the joined thread is terminated.Detaching A Thread
We have seen how threads can be joined using the
pthread_join()
function. In fact, threads that are in a 'join-able' state, must be joined by other threads, or else their memory resources will not be fully cleaned out. This is similar to what happens with processes whose parents didn't clean up after them (also called 'orphan' or 'zombie' processes).
If we have a thread that we wish would exit whenever it wants without the need to join it, we should put it in the detached state. This can be done either with appropriate flags to the
pthread_create()
function, or by using the pthread_detach()
function. We'll consider the second option in our tutorial.
The
pthread_detach()
function gets one parameter, of type pthread_t
, that denotes the thread we wish to put in the detached state. For example, we can create a thread and immediately detach it with a code similar to this:
pthread_t a_thread; /* store the thread's structure here */
int rc; /* return value for pthread functions. */
extern void* thread_loop(void*); /* declare the thread's main function. */
/* create the new thread. */
rc = pthread_create(&a_thread, NULL, thread_loop, NULL);
/* and if that succeeded, detach the newly created thread. */
if (rc == 0) {
rc = pthread_detach(a_thread);
}
No comments:
Post a Comment