关键:

pthread_cancel函数发送终止信号

pthread_setcancelstate函数设置终止方式

pthread_testcancel函数取消线程(另一功能是:设置取消点)

1 线程取消的定义

一般情况下,线程在其主体函数退出的时候会自动终止,但同时也可以因为接收到另一个线程发来的终止(取消)请求而强制终止。

2 线程取消的语义

线程取消的方法是向目标线程发Cancel信号(pthread_cancel函数发送Cancel信号),但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态(pthread_setcancelstate函数设置状态)决定。

线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。

3 取消点

根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、 pthread_cond_timedwait()、sem_wait()、sigwait()等函数以及read()、write()等会引起阻塞的系统调用都是Cancelation-point,而其他pthread函数都不会引起Cancelation动作。但是pthread_cancel的手册页声称,由于LinuxThread库与C库结合得不好,因而目前C库函数都不是Cancelation-point;但CANCEL信号会使线程从阻塞的系统调用中退出,并置EINTR错误码,因此可以在需要作为Cancelation-point的系统调用前后调用 pthread_testcancel(),从而达到POSIX标准所要求的目标,即如下代码段:

pthread_testcancel();

retcode = read(fd, buffer, length);

pthread_testcancel();

4 程序设计方面的考虑

如果线程处于无限循环中,且循环体内没有执行至取消点的必然路径,则线程无法由外部其他线程的取消请求而终止。因此在这样的循环体的必经路径上应该加入pthread_testcancel()调用。

5 与线程取消相关的pthread函数

int pthread_cancel(pthread_t thread)

发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。

int pthread_setcancelstate(int state, int *oldstate)

设置本线程对Cancel信号的反应,state有两种值:PTHREAD_CANCEL_ENABLE(缺省)和 PTHREAD_CANCEL_DISABLE,分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行;old_state如果不为 NULL则存入原来的Cancel状态以便恢复。

int pthread_setcanceltype(int type, int *oldtype)

设置本线程取消动作的执行时机,type由两种取值:PTHREAD_CANCEL_DEFFERED和 PTHREAD_CANCEL_ASYCHRONOUS,仅当Cancel状态为Enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作(退出);oldtype如果不为NULL则存入运来的取消动作类型值。

void pthread_testcancel(void)

功能一:设置取消点;

功能二:检查本线程是否处于Canceld状态,如果是,则进行取消动作,否则直接返回。

代码:

#include #include #include #include #include #define THREAD_MAX 4 pthread_mutex_t mutex; pthread_t thread[THREAD_MAX]; static int tries; static int started; void print_it(int *arg) { pthread_t tid; tid = pthread_self(); printf("Thread %lx was canceled on its %d try.n",tid,*arg); } void *Search_Num(int arg) { pthread_t tid; int num; int k=0,h=0,j; int ntries; tid = pthread_self(); /*while(pthread_mutex_trylock(&mutex) == EBUSY) { printf("**************busy****************n"); pthread_testcancel(); }*/ srand(arg); num = rand()&0xFFFFFF; //pthread_mutex_unlock(&mutex); printf("thread num %lxn",tid); ntries = 0; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL); pthread_cleanup_push((void *)print_it,(void *)&ntries); while(1) { num = (num+1)&0xffffff; ntries++; if(arg == num) { //只允许一个线程操作此处 while(pthread_mutex_trylock(&mutex) == EBUSY) { //一个线程操作后其余线程进入次循环挂起,等待pthread_cancel函数发送cancel信号终止线程 k++; if(k == 10000) { printf("----------2busy2-----------n"); } pthread_testcancel(); } tries = ntries; //pthread_mutex_unlock(&mutex); //如果加上这句话,将会有好几个线程找到主函数中设定的值pid printf("Thread %lx found the number!n",tid); for(j = 0;j

运行结果:

Search the num of 6531 -----------i = 0-------------- thread num b6fbcb70 thread num b67bbb70 thread num b5fbab70 thread num b77bdb70 ----------thread num b67bbb70------------- Thread b67bbb70 found the number! ----------thread num b6fbcb70------------- ----------thread num b77bdb70------------- ----------2busy2----------- ----------thread num b5fbab70------------- ----------2busy2----------- Thread b5fbab70 was canceled on its 1174527 try. Thread b77bdb70 was canceled on its 1023100 try. -----------i = 1-------------- Thread b6fbcb70 was canceled on its 1174527 try. -----------i = 2-------------- -----------i = 3-------------- It took 1174527 tries ot find the number!

从这结果里你有没有看出什么呢?呵呵~.~

以上就是小编为大家带来的linux线程的取消(终止)方法全部内容了,希望大家多多支持脚本之家~

linux取消线程的原理,linux线程的取消(终止)方法相关推荐

  1. c++ socket线程池原理_ThreadPoolExecutor线程池实现原理+源码解析

    推荐学习 被微服务轰炸?莫怕!耗时35天整出的「微服务学习教程」送你 死磕「并发编程」100天,全靠阿里大牛的这份最全「高并发套餐」 闭关28天,奉上[Java一线大厂高岗面试题解析合集],备战金九银 ...

  2. Java高并发编程详解系列-线程池原理自定义线程池

    之前博客的所有内容是对单个线程的操作,例如有Thread和Runnable的使用以及ThreadGroup等的使用,但是对于在有些场景下我们需要管理很多的线程,而对于这些线程的管理有一个统一的管理工具 ...

  3. linux基本命令的使用原理,linux基本常用命令及其使用方法

    Linux命令及使用方法 一.shell 1.Linux系统中运行的一种特殊程序 2.在用户和内核之间充当"翻译官" 3.用户登录Linux系统时,自动加载一个shell程序 4. ...

  4. java线程饥饿原理,Java线程饥饿和锁的公平性「译」

    一个线程因为被其它线程抢占了而分配不到时间片,这就是[饥饿].这个线程[饿的要死]因为只有别的线程可以得到CPU时间片,就它得不到.解决饥饿的方法叫着公平性--所有的线程都有机会得到运行. 线程饥饿的 ...

  5. linux全网备份的原理,Linux面试题分享:Rsync(全网备份)和NFS(文件系统)

    1.1 全网备份(rsync)html 1.1.1.1 ssh2 的默认监听端口是:, ssh 的配置文件是linux 1.1.1.2 服务器 172.24.138.3 上有/data/postmal ...

  6. python线程池原理_Python3线程池ThreadPoolExecutor总结

    是什么 如何用 常用方法一:with ThreadPoolExecutor as t: t.submit import concurrent.futures import urllib.request ...

  7. linux系统裁剪扩充原理,Linux入门之系统内核原理之初级系统裁剪----“我的系统我做主”...

    在上一篇开机启动顺序的博客里,自己混乱的大脑抗不住了.回头看自己写的博文,实在是难以入目.在随后深入了解系统内核原理之后,这里通过动手实验,在原有centos6.0基础上,裁剪出来一个简单的Linux ...

  8. linux 单调时间实现原理,Linux系统下的单调时间函数

    欢迎转载,转载请注明出处:http://forever.blog.chinaunix.net 一.编写linux下应用程序的时候,有时候会用到高精度相对时间的概念,比如间隔100ms.那么应该使用哪个 ...

  9. Linux内核锁实现原理,linux 大内核锁原理

    大内核锁(BKL)的设计是在kernel hacker们对多处理器的同步还没有十足把握时,引入的大粒度锁. 他的设计思想是,一旦某个内核路径获取了这把锁,那么其他所有的内核路径都不能再获取到这把锁. ...

最新文章

  1. QTexe软件设置系统默认的图标
  2. 杭州计算机学校哪家好,杭州2021年哪所计算机学校比较好
  3. Java System类loadLibrary()方法与示例
  4. CVPR 2021 3D视觉相关最新进展分享
  5. 博客网最终能否破茧成蝶?
  6. SAP License:企业高管眼中的信息化是“万能”的
  7. 【bzoj 1102】[POI2007]山峰和山谷Grz(BFS)
  8. mysql客户端汉化_【原创】Mysql客户端如何处理中文
  9. 萤火虫算法_一种优化方法:蜂鸟优化算法
  10. android 命令pm 全称 packagemanager,Android.content.pm.PackageManager--(转载)
  11. 关于无线网络的静态ip与动态ip设置
  12. 二手房房源信息数据分析项目完整流程
  13. 08-Linux账号管理学习
  14. android版手机qq 5.0,手机QQ5.0安卓版今日正式发布 手机QQ5.0更新升级内容介绍
  15. Hive视图与物化视图
  16. iTunes制作铃声------将制作铃声导入到手机中
  17. 【强烈推荐】人工智能系列文章推送公告!!!
  18. Vulkan Samples 阅读 -- Extensions(二)
  19. 高级工计算机操作系统试题及答案,计算机系统操作高级工试题和答案[1].
  20. python简单入门——画多啦A梦

热门文章

  1. 现在才发现:敏捷迭代的好处实在太多了
  2. 买房后为何有装修公司找你?个人信息就卖5毛钱
  3. RF+APPIUM详细使用教程
  4. “希希敬敬对”团队作业-敏捷冲刺-3
  5. C语言“水仙花数”是一个正三位数,他的个位十位百位的立方和等于他本身
  6. 2022-08-04 Brighthouse: An Analytic DataWarehouse for Ad-hoc Queries
  7. android资源库
  8. 网页变灰的方法,适用于IE
  9. mysql触发器的作用及语法
  10. 全国全媒体广告投放广告信息流广告精准投放形式 短视频广告投放流程