- 1、本文档共62页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MultiCore.04
Pthreads多线程应用程序设计 POSIX线程的创建和撤销 创建线程 thread: 新创建的线程的句柄,也称线程id ; attr: 创建线程时设置的线程属性,NULL表示取默认值 ; start_routine: 新线程启动时调用的函数。该函数返回时,新建线程执行结束; arg:传给start_routine()的参数,void *类型,可以取任意类型。无参数传递时取NULL。 线程属性 结构pthread_attr_t中的元素分别对应着新线程的运行属性: __detachstate,表示新线程是否与进程中其他线程脱离同步。可用pthread_detach()来设置。缺省为PTHREAD_CREATE_JOINABLE状态;若置为 PTHREAD_CREATE_DETACH状态,表示新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。 __schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用pthread_setschedparam()来改变。 __schedparam,一个sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为SCHED_RR或SCHED_FIFO时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。 线程属性 __inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。 __scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。 取消线程 线程会在其主体函数结束的时候自动终止,也会因为接收到另一个线程发来的终止( Cancel )请求而强制终止。 如何处理其他线程发来的Cancel信号,由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至取消点(Cancelation-point),由不同的Cancelation状态决定。 缺省情况下(即pthread_create()创建线程的缺省状态),线程接收到Cancel信号是继续运行至取消点。也就是说,设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。 取消线程 根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait()等函数以及read()、write()等会引起阻塞的系统调用都是取消点,而其他pthread函数都不会引起Cancelation动作。 由于Linux线程库与C库结合得不好,因而目前C库函数都不是取消点;但Cancel信号会使线程从阻塞的系统调用中退出,并置EINTR错误码,因此可以在需要作为取消点的系统调用前后调用pthread_testcancel(),从而达到POSIX标准所要求的目标。如: 取消线程 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_AS
文档评论(0)