假设线程A对线程B发出了一个取消请求。通过如下函数:
#include <pthread.h> int pthread_cancel(pthread_t thread); 参数: thread - 收到取消请求的线程id 返回值: 发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。
线程B如何反应呢?
这取决线程的两个状态属性,它们决定了该线程收到取消请求时的行为,下面给出这两个字段的意义和用法。
(1)线程的cancelability state
字段可以取值为:enabled (默认) or disabled。当取值为enabled,由cancelability type属性决定线程的行为。当取值为disabled,线程不可被取消,但取消请求还是会被接受。
#include <pthread.h> int pthread_setcancelstate(int state, int *oldstate); 参数: state - 设置线程的取消state,可以取如下值 PTHREAD_CANCEL_ENABLE(默认取值) PTHREAD_CANCEL_DISABLE oldstate - 用作保存线程之前的取消state
(2)线程的cancelability type
#include <pthread.h> int pthread_setcanceltype(int type, int *oldtype); 参数: type - 取值如下 PTHREAD_CANCEL_DEFERRED(默认取值) 取消请求会被推迟到调用一个是cancellation point的函数,参看http://man7.org/linux/man-pages/man7/pthreads.7.html PTHREAD_CANCEL_ASYNCHRONOUS线程可以在任何时候被取消。(通常,线程只要接收到取消请求,便会直接被取消。但是系统不保证这一点)。 oldtype - 保存旧的type
一个例子
#include <pthread.h> #include <unistd.h> #include <stdio.h> void wait() { for(int i = 0; i < 10000; i++){ for (int j = 0; j < 1000; j++){ int k = 4; } } } void* PrintHello(void* threadid) { wait();//延时,等待足够时间以至于能够使得这个线程接收到取消请求。不用sleep函数是因为,这里需要测试pthread_testcancel函数是否是取消点,然而sleep也是取消点 pthread_testcancel();// printf("hi\n"); //这一行不会被打印 pthread_exit(NULL); } int main(){ pthread_t tid; pthread_create(&tid, NULL, PrintHello, NULL); pthread_cancel(tid);//对tid对应的线程发送一个取消请求 pthread_exit(NULL); return 0; }
1.需要的头文件
#include <pthread.h>
2.编译指令
gcc main.c -lpthread
3.相关概念
http://man7.org/linux/man-pages/man3/pthread_setcancelstate.3.html
时间: 2024-10-18 01:36:29