假设线程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 = ; i < ; i++){
for (int j = ; j < ; j++){
int k = ;
}
}
} 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 ;
}

1.需要的头文件

#include <pthread.h>

2.编译指令

gcc main.c -lpthread

3.相关概念

http://man7.org/linux/man-pages/man3/pthread_setcancelstate.3.html

最新文章

  1. iOS开发拓展篇—音频处理(音乐播放器4)
  2. swift 存储属性和计算属性 set{}和get{} didSet{}和willSet{}
  3. git如何ignore
  4. Swift入门篇-swift简介
  5. .NET System.Timers.Timer的原理和使用(开发定时执行程序)
  6. Queueing in the Linux Network Stack !!!!!!!!!!!!!!!
  7. Uncaught TypeError: Object [object Object] has no method &#39;live&#39;
  8. ReactiveCocoa 设置绑定注意事项
  9. Spring Boot之WebSocket
  10. python_内置函数
  11. mybatis 映射生成mapper和pojo ---逆向工程的使用过程
  12. 调用Excel宏批量处理文件
  13. C语言 - 栈和单链表的实现
  14. App Store转让App
  15. Linux下编译安装Lnmp
  16. 【被C折腾系列】用C调DIOCP编码客户端通信
  17. Python 基础常用
  18. 进制转换&amp;数据类型(1)
  19. solr 加载 停用/扩展词典
  20. python 小练习 11

热门文章

  1. Ubuntu14.04 系统复制迁移到新的机器上
  2. Logback 日志策略配置
  3. 【SVN】彻底 svn 服务器上的 删除某一个文件或文件夹
  4. IDEA中log4j.properties配置文件详解
  5. Vue UI组件库
  6. 【原创】smarty引擎下的导航按钮高亮实现
  7. 从零搭建配置Cuckoo Sandbox
  8. 一文搞定HashMap的实现原理和面试
  9. SqlDbx连接oracle(可用)
  10. Swift加载Xib创建的Controller