- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
有两个线程属性没有包含在pthread_attr_t中,即可取消状态、可取消类型 可取消状态的两种值 PTHREAD_CANCEL_ENABLE(默认值):当pthread_cancel调用后并不等待线程终止,线程达到某个取消点时,会检查是否有请求要求线程终止。 PTHREAD_CANCEL_DISABLE:pthread_cancel并不能杀死线程;但是该请求将被处于未决状态。当变为PTHREAD_CANCEL_ENABLE后,将重新递送该请求 * 函数原型 #includepthread.h int pthread_setcancelstate(int state, int *oldstate); 参数和返回值 state:设置的状态 oldstate:原来的状态 成功返回0,否则返回错误编号 * 默认的取消类型也称为延迟取消(PTHREAD_CANCEL_DEFERRED)。在调用pthread_cancel之后,在线程到达取消点之前,并不会出现真正的取消 另一类型异步取消PTHREAD_CANCEL_ASYNCHRONOUS: 线程可以在任意时间被取消,而不是非得遇到取消点才能被取消 * 取消点是线程检查是否被取消并按照请求进行动作的一个位置。POSIX.1保证线程调用一些函数时,取消点都会出现。 函数原型 #includepthread.h int pthread_setcanceltype(int type, int *oldtype); 参数和返回值 type:设置的类型 oldtype:原来的类型 成功返回0,否则返回错误编号 * 每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有线程共享的 尽管单个线程可以阻止某些信号,但当另外线程修改了与某个信号相关的处理行为以后,所有的线程都必须共享这个处理行为的改变 若一个线程选择忽略某个信号,而其他线程可以恢复信号的默认处理动作,或设置一个信号处理函数,从而撤销上述线程的选择 * 信号的处理方式,是进程范围内是唯一的 任意线程,对信号处理方式的修改,对其余线程而言都是可见的。即它们共享同一处理方式 * 进程中的信号是递送到单个线程的。 如果信号与硬件故障或计时器超时有关,该信号就被发送到引起该事件的线程中去 而其他的信号则被发送到任意一个线程 Linux中的情况真是如此吗?不同的系统实现,或有不同 * 在进程编程模式下,使用sigprocmask来阻止信号的发送。 但是,该函数的行为在多线程的进程中并未定义,线程必须使用pthread_sigmask 函数原型 #includesignal.h int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); * int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); 返回值与参数 成功返回0,出错返回错误编号 oset:进程的当前信号屏蔽字通过oset返回,若不关心当前信号屏蔽字,可以设为NULL 若set不为NULL,则 若how=SIG_BLOCK,则进程新的信号屏蔽字是当前信号屏蔽字和set指向信号集的并集,set包含了希望阻塞的附加信号 若how=SIG_UNBLOCK,则进程新的信号屏蔽字是当前信号屏蔽字和set指向信号集补集的交集,set包含了希望解除阻塞的信号 若how=SIG_SETMASK,则进程新的信号屏蔽字将被set指向的信号集的值代替 * 其他线程在被创建时,其信号屏蔽字,会继承主线程的信号屏蔽字 当将信号发送给进程时,信号首先会被递送到主线程(进程);若主线程屏蔽了该信号,则信号被递送到第一个被创建的线程;以次类推,直到找到未屏蔽该信号的线程 当将信号直接递送给某个非主线程(进程),若该线程屏蔽了该信号,则首先将信号递送到主线程,然后再按照上述方式处理 * 使得调用该函数的线程,可以等待一个或多个信号发生 函数原型 #includesignal.h int sigwait(const sigset_t *set, int *signop); 参数和返回值 set:指定线程等待的信号集 signop:指向的整数将作为返回值,即接收到的信号的ID 成功返回0,否则返回错误编号 * 在调用sigwait之前,必须要阻塞那些需要等待的信号 sigwait函数会自动取消信号集的阻塞状态 在sigwait返回之前,将自动恢复线程的信号屏蔽字 当有信号达到时,sigwait函数返回。而此时信号处理函数不会被调用。 若信号在sigwait调用之前没有被阻塞,在完成对si
原创力文档


文档评论(0)