The pthread_cancel() function is used to request the cancellation of a specific thread. It is provided by the POSIX Threads (pthread) library.
- It takes the thread ID (pthread_t) as an argument and sends a cancellation request to that thread.
- The target thread may handle the cancellation immediately or at a cancellation point, depending on its cancellation state and type.
Program: Cancel self thread
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void* calls(void* ptr)
{
printf("GeeksForGeeks");
// To exit the current thread
// pthread_self() return the particular thread id
pthread_cancel(pthread_self());
return NULL;
}
int main()
{
// NULL when no attribute
pthread_t thread;
// calls is a function name
pthread_create(&thread, NULL, calls, NULL);
// Waiting for when thread is completed
pthread_join(thread, NULL);
return 0;
}
Output:
GeeksForGeeks
If you use Linux then compile this program gcc program_name.c -lpthread
Syntax
int pthread_cancel(pthread_t thread);
Program: Cancel other thread
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
// To Count
int counter = 0;
// for temporary thread which will be
// store thread id of second thread
pthread_t tmp_thread;
// thread_one call func
void* func(void* p)
{
while (1) {
printf("thread number one\n");
sleep(1); // sleep 1 second
counter++;
// for exiting if counter = = 5
if (counter = = 2) {
// for cancel thread_two
pthread_cancel(tmp_thread);
// for exit from thread_one
pthread_exit(NULL);
}
}
}
// thread_two call func2
void* func2(void* p)
{
// store thread_two id to tmp_thread
tmp_thread = pthread_self();
while (1) {
printf("thread Number two");
sleep(1); // sleep 1 second
}
}
// Driver code
int main()
{
// declare two thread
pthread_t thread_one, thread_two;
// create thread_one
pthread_create(&thread_one, NULL, func, NULL);
// create thread_two
pthread_create(&thread_two, NULL, func2, NULL);
// waiting for when thread_one is completed
pthread_join(thread_one, NULL);
// waiting for when thread_two is completed
pthread_join(thread_two, NULL);
}
Output:
thread number one
thread number two
thread number one
thread number two
If you use Linux then compile this program gcc program_name.c -lpthread