`
xitong
  • 浏览: 6193460 次
文章分类
社区版块
存档分类
最新评论

Linux线程-终止

 
阅读更多

在前文讨论了线程创建的一些基本东西,这里讨论有哪些方法可以使线程终止,线程终止又是如何与创建所需的参数进行关联的。

一,正常终止

线程在执行完成之后,正常终止。

二,线程取消

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

2.2 线程取消的语义
线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。

2.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();

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

2.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状态,如果是,则进行取消动作,否则直接返回。

三,pthread_exit

在线程内显示的调用,以终止线程。

四,等待终止

在一个线程里面,我们要等待另一个线程结束。可以通过调用pthread_join函数。

pthread_join (pthread_t thread, void** threadreturn);

这将会在调用线程引起阻塞,并且在创建thread所指定的线程时,其分离属性必须是pthread_create_joinable.否则调用出错。


分享到:
评论

相关推荐

    08.多线程编程基础-停止线程-使用stop方法强行终止线程.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    linux c-unix c多线程服务器的程序框架

    这是一个linux c/unix c多线程服务器的程序框架 这个框架与全球所有教科书上讲的...不容易自己死亡而失控的,每个线程终止返回,线程池有 记号,每次连接时产生一个新线程后,程序自动描扫线 程池,回收已终止的线程资源.

    linux多线程编程

    linux多线程编程 声明:本文是网上整理的资料,版权属其作者本人所有。 1 第一章 线程基础知识 2 一.什么是线程 2 二.线程的优点 2 三.线程的缺点 2 四.线程的结构 2 五.线程标识 2 六.线程的创建 3 七..线程...

    Window下多线程编程、Linux下多线程编程-多线程实验bistu

    (1)基于CreateThread实现多线程,并实现线程的恢复、暂停、终止等。 (2)基于Beginthread实现多线程,并实现线程的简单同步。 (3)实现多线程字符串查找程序 Linux: (1)实现多线程字符输出,存在三个线程,...

    linux线程的取消(终止)方法

    一般情况下,线程在其主体函数退出的时候会自动终止,但同时也可以因为接收到另一个线程发来的终止(取消)请求而强制终止。 2 线程取消的语义 线程取消的方法是向目标线程发Cancel信号(pthread_cancel函数发送...

    Linux内核或应用程序异常终止调试方法

    Linux内核或应用程序异常终止调试方法

    linux多线程设计及示例

    当一个可汇合的线程终止时,它的线程ID和退出状态将留到另一个线程对它调用pthread_join。脱离线程却象守护进程:当它们终止的时,所有相关资源都被释放,我们不能等待它们终止。如果一个线程需要知道另一个线程什么...

    linux多线程编程按键退出

    在Linux多线程编程例子—生产者与消费者的实验基础上,实现即时“ESC”按键结束所有线程并退出。

    linux线程相关操作导图

    主要为linux线程导图,其中包含:线程基本知识,线程创建与终止,栈清理,线程的取消选项,想成同步,线程属性,线程同步属性,重入,互斥量,锁,条件变量,线程与信号,线程与fork,线程与I/O等。 如果需要导图源...

    linux系统编程之线程.zip

    一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于...

    linux系统下多线程编程文档资料

    线程的终止 4 八、一次性初始化 8 九、线程的私有数据 9 第二章 线程高级知识 11 一.线程属性 11 二、线程的分离状态 12 三、线程的继承性 13 四、线程的调度策略 13 五、线程的调度参数 14 六、线程的作用域 16 七...

    Linux多线程环境下 关于进程线程终止函数总结

    下面小编就为大家带来一篇Linux多线程环境下 关于进程线程终止函数总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Posix线程编程指南.rar

    1.2 创建线程 1.3 线程创建属性 1.4 线程创建的Linux实现 2.线程取消 2.1 线程取消的定义...线程终止 5.1线程终止方式 5.2线程终止时的清理 5.3线程终止的同步及其返回值 ... .. .

    LINUX环境高级编程 第六章 线程管理

    线程的概念 线程的创建 线程的终止 线程的同步 线程属性 同步属性 取消选项 线程和信号 线程和fork

    Linux下的多进程/线程网络通信

    本作业要求在Linux下使用C语言实现一个抓取并分析网络数据的软件系统。该系统采用客户端和服务器端开发模式。在客户端,设计两个进程P1和P2同时读取网卡上的数据,P1读取数据后,负责将TCP报文中的头部数据写入到...

    深入分析父子线程、进程终止顺序不同产生的结果

    一、线程Linux线程创建函数为pthread_create(),默认规则是谁创建子线程,谁就要负责子线程的资源回收,当父线程退出后,子线程也随着退出。所以,一般情况下,父线程退出时都要确保子线程已经退出,所以会使用...

    Linux网络编程 视频 教程

    Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输单元(MTU)/路径MTU 以太网帧...

    Linux多线程编程快速入门

    主要介绍了Linux多线程编程快速入门,涉及到了线程基本知识,线程标识,线程创建,线程终止,管理线程的终止等相关内容,小编觉得还是挺不错的,这里分享给大家,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics