- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于线程退出方式.PDF
关于线程退出方式
一般来说,线程有4 种退出方式:
(1) 线程执行完后隐式退出,即不调用任何结束线程的函数,自动退出;
(2 ) 由线程自身调用pthread_exit(void *retvalue)显示退出,这是一种自杀式退出方式;
(3 ) 被其他线程调用pthread_cancel (pthread_t thread)结束由thread 指定的线程,调用是
异步的,且不管对方线程是否满足正常退出条件,都会惨无人道的强杀对方;
(4 ) 被其他线程调用pthread_join (pthread_t thread, void** retvalue)结束由thread 指定的线
程,该调用会挂起当前线程直到对方线程正常退出为止,这是一种比较人道的他杀;
各种情况测试:
(1)测试pthread_cancel 是否是异步调用,即不会阻塞当前线程;
确实是异步调用,不会阻塞。而且即使对方线程没有满足退出条件,也可以强制使其退出。
(2 )测试pthread_join 是否是阻塞调用,即会一直等到对方线程杀死为止;
确实是阻塞调用,且如果对方线程没有满足退出条件,会一直阻塞等待对方线程满足退出条
件,这样很容易引起死锁,因此调用pthread_join 之前必须先使对方线程的退出条件得到满
足。
(3 )如果对方线程已经退出,调用pthread_cancel 会得到什么返回值?
[ESRCH] No thread could be found corresponding to that specified by the
given thread ID.
(4 )如果对方线程已经退出,调用pthread_join 会得到什么返回值?会一直阻塞吗?
不会阻塞,会立即返回“0 ”值,表明线程已经退出。
(5 )先调用pthread_cancel,再调用pthread_join 会得到什么结果?
结果同(4 )
(6)如果线程一直阻塞等待mutex,调用pthread_cancel 会怎么样?能正常结束目标线程
吗?
调用pthread_cancel 后会立即返回,且返回值为“0 ”,但目标线程并没有真正结束,还是一
直在等mutex 。但是如果用pthread_setcanceltype( PTHREAD_CANCEL_ASYNCHRONOUS,
oldtype) 在目标线程里设置取消类型为 PTHREAD_CANCEL_ASYNCHRONOUS 后,
pthread_cancel 可以正常结束目标线程。
(7 )如果线程一直阻塞等待mutex,调用pthread_join 会怎么样?能正常结束目标线程吗?
不管目标线程的取消类型是否为 PTHREAD_CANCEL_ASYNCHRONOUS ,都不能正常结
束目标线程,且会阻塞在pthread_join 上,实际上取消类型只对pthread_cancel 有效。
(8 )如果线程一直阻塞在条件等待,调用pthread_cancel 会怎么样?能正常结束目标线程
吗?
pthread_cond_wait()和pthread_cond_timedwait()及sem_wait()都被实现为取消点,可以正常结
束目标线程,但如果pthread_cond_wait()被取消,mutex 是保持锁定状态的,因而需要定义
退出回调函数来为其解锁。
void * child1(void *arg)
{
pthread_cleanup_push(pthread_mutex_unlock,mutex);
while(1)
{
pthread_mutex_lock(mutex);
pthread_cond_wait(cond,mutex);
pthread_mutex_unlock(mutex);
sleep(5);
}
pthread_cleanup_pop(0); /* comment 2 */
}
线程取消详细介绍(pthread_cancel)
1、线程取消的定义
一般情况下,线程在其主体函数退出的时候会自动终止,但同时也可以因为接收到另一个线
程发来的终止(取消)请求而强制终止。
2、线程取消的语义
线程取消的方法是向目标线程发Cancel 信号,
文档评论(0)