线程控制PPT演示课件_第1页
线程控制PPT演示课件_第2页
线程控制PPT演示课件_第3页
线程控制PPT演示课件_第4页
线程控制PPT演示课件_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,线程是进程中的一个实体,是CPU调度和分配的基本单位.线程共享资源,同一进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到。,Linux下线程控制,2,除此之外,各线程还共享以下进程资源和环境: 文件描述符表 每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数) 当前工作目录 用户id和组id线程独享资源 线程id 上下文,包括各种寄存器的值、程序计数器和栈指针 栈空间 errno变量 信号屏蔽字 调度优先级,Linux下线程控制,3,线程控制创建线程 #include int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg); 返回值:成功返回0,失败返回错误号。 thread: 线程标识符 attr: 线程属性设置,没有特殊设定,设置为NULL start_routine:线程函数起始地址 arg: 传递给start_routine的参数,Linux下线程控制,4,关键字restrict只用于限定指针; 该关键字用于告知编译器,所有修改该指针所指向内容的 操作全部都是基于(base on)该指针的,即不存在其它进 行修改操作的途径;这样的后果是帮助编译器进行更好的 代码优化,生成更有效率的汇编代码。 (具体见0-restrict.doc),Linux下线程控制,5,涉及多参数传递给线程的,需要使用结构体将参数封装后,将结构体指针传给线程定义一个结构体,例如:struct mypara var para1;/参数1 var para2;/参数2将这个结构体指针,作为void *形参的实际参数传递struct mypara pstru;pthread_create(,Linux下线程控制,6,函数中要定义一个mypara类型的结构指针来引用这个参数 void *thr_fn(void *arg) mypara *pstru; pstru = (* struct mypara) arg; pstru-para1 . ;/参数1的操作 pstru-para2 ;/参数2的操作 ,Linux下线程控制,7,pthread_create函数接受的参数只有一个void *型的指针,这就意味着只能通过结构体封装超过一个以上的参数作为一个整体传递。这是pthread_create函数的接口限定的,定义中已经明确表明只接受一个参数,你硬要塞给他两个肯定会出错了。所以通过结构体这种组合结构变通一下,同样实现了只通过一个参数传递,但通过结构指针对结构数据成员的 引用实现多参数的传递。,Linux下线程控制,8,一个线程可以调用pthread_cancel终止同一进程中的另一个线程,可以调用pthread_exit终止自己。#include void pthread_exit( void *retval ) retval: pthread_exit调用者线程的返回值,可由其他函数和pthread_join来检测获取。 注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。,Linux下线程控制,9,pthread_cancel #include int pthread_cancel(pthread_t id) 返回值: 若成功返回0,否则返回错误编号 pthread_cancel并不等待线程终止,它仅仅提出请求。,Linux下线程控制,10,看一下pthread_cancel()的用法:线程取消的方法是向目标线程发Cancel信号,但如何处理 Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。 线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。,Linux下线程控制,11,什么是线程取消点 根 据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、 pthread_cond_timedwait()、sem_wait()、sigwait()等函数以及read()、write()等会引起阻塞的系统调用都是Cancelation-point(支持的不好),而其他pthread函数不会引起Cancelation动作。 可以在需要作为Cancelation-point的系统调用前后调用 pthread_testcancel(),从而起到取消点的作用。,Linux下线程控制,12,可以在需要作为Cancelation-point的系统调用前后调用 pthread_testcancel(),从而起到取消点的作用。如: pthread_testcancel(); retcode = read(fd, buffer, length); pthread_testcancel(); 另例如,如果线程处于无限循环中,且循环体内没有执行至取消点的必然路径,则线程无法由外部其他线程的取消请求而终止。因此在这样的循环体的必经路径上应该加入pthread_testcancel()调用。,Linux下线程控制,13,int pthread_setcancelstate(int state, int *oldstate) 设置本线程对Cancel信号的反应state有两种值:PTHREAD_CANCEL_ENABLE(缺省)和 PTHREAD_CANCEL_DISABLE,分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行;old_state:如果不为NULL则存入原来的Cancel状态。以便恢复。,Linux下线程控制,14,int pthread_setcanceltype(int type, int *oldtype) 设置本线程取消动作的执行时机type由两种取值:PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYCHRONOUS,仅当Cancel状态为Enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作(退出);oldtype如果不为NULL则存入运来的取消动作类型值。void pthread_testcancel(void) 检查本线程是否处于Canceld状态,如果是,则进行取消动作,否则直接返回。,Linux下线程控制,15,等待线程退出:int pthread_join( pthread_t *th,void * value_ptr) th: 等待线程的标识符 value_ptr :用户定义指针,用来存储被等待线程的返回值, 调用该函数的线程将挂起等待,直到id为th的线程终止。,Linux下线程控制,16,thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下: 如果thread线程通过return返回,value_ptr所指向的单元里存放的是thread线程函数的返回值。 如果thread线程被别的线程调用pthread_cancel异常终止 的,value_ptr所指向的单元里存放的是常数PTHREAD_CANCELED,即(void *) -1) 。,Linux下线程控制,17,如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。 如果对thread线程的终止状态不感兴趣,可以传NULL给value_ptr参数。,Linux下线程控制,18,一般情况下,线程终止后,其终止状态一直保留到其它线 程调用pthread_join获取它的状态为止。 但是线程也可以被置为detach状态,这样的线程一旦终止 就立刻回收它占用的所有资源,而不保留终止状态。 不能对一个已经处于detach状态的线程调用pthread_join, 这样的调用将返回EINVAL。,Linux下线程控制,19,对一个尚未detach的线程调用pthread_join或 pthread_detach都可以把该线程置为detach状态,也就是 说,不能对同一线程调用两次pthread_join,或者如果已 经对一个线程调用了pthread_detach就不能再调用pthread_join了。int pthread_detach(pthread_t tid); 返回值:成功返回0,失败返回错误号。,Linux下线程控制,20,线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。pthread_cleanup_push()函数执行压栈(注册)清理函数的操作;pthread_cleanup_pop()函数执行从栈中删除清理函数的操作。,Linux下线程控制,21,#include 函数原型:void pthread_cleanup_push( void (*rtn)(void *), void *arg);rtn 处理程序入口地址arg 传递给处理函数的参数void pthread_cleanup_pop(int execute);execute表示执行时是否在弹出清理函数的同时执行该注册函数,为0表示不执行,非0为执行。,Linux下线程控制,22,pthread_cleanup_push来注册清理函数rtn, 这个函数有一个参数arg。 在以下三种情形之一发生时,注册的清理函数被执行: 1)调用pthread_exit,而不是直接return。 2)作为对取消线程请求(pthread_cancel)的响应。 3)以非0参数调用pthread_cleanup_pop。,Linux下线程控制,23,注意: 1)如果线程只是由于简单的返回(return)而终止的,则清除函数不会被调用。 2)如果pthread_cleanup_pop被传递0参数,则清除函数不会被调用,但是会清除处于栈顶的清理函数。,Linux下线程控制,24,1.当pthread_cleanup_pop

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论