首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >posix线程中的线程取消

posix线程中的线程取消
EN

Stack Overflow用户
提问于 2013-10-16 01:56:07
回答 3查看 1.9K关注 0票数 3

我正在使用POSIX线程,我的问题是,一个线程是否可以通过在pthread_cancel函数中传递自己的线程id来取消自己?如果是,那么其含义是什么?

此外,如果主程序创建了两个线程,并且其中一个线程取消了另一个线程,那么被取消线程的返回值和资源会发生什么变化,以及如何从主程序获知哪个线程被取消,..since主程序不会取消任何线程

我正在使用异步取消

热心的帮助

EN

回答 3

Stack Overflow用户

发布于 2013-10-16 02:22:18

Q1:是的,线程可以自行取消。但是,这样做通常会带来取消的所有负面后果;您可能希望改用pthread_exit,这在某种程度上更容易预测。

Q2:当线程被取消时,它不会生成返回值;相反,pthread_join会将特殊值PTHREAD_CANCELED放在其retval参数所指向的位置。不幸的是,在调用pthread_join之前,您必须通过一些其他方式知道某个特定线程已明确终止(以某种方式),否则调用线程将永远阻塞。没有waitpid(..., WNOHANG)waitpid(-1, ...)的可移植等价物。(手册页上写着“如果您认为您需要此功能,您可能需要重新考虑您的应用程序设计”,这让我很想给某人一记耳光。)

Q2a:这取决于你所说的“线程资源”是什么意思,. 线程控制块和堆栈将被释放。所有使用pthread_cleanup_pushpthread_key_create注册的析构函数都将被执行(在线程终止之前);一些运行时还会为堆栈上的对象执行C++类析构函数。应用程序程序员有责任确保线程拥有的所有资源都由其中一种机制覆盖。请注意,其中一些机制具有固有的竞争条件;例如,不可能打开文件并将其作为原子操作推送关闭的清理,因此存在一个窗口,在该窗口中取消操作可能会泄漏打开的文件。(不要认为这可以通过在打开文件之前推入清理来解决,因为延迟取消的常见实现是在系统调用返回时检查延迟取消,即,精确计时以命中OS将文件描述符号写入返回值寄存器与调用函数将该寄存器复制到清理期望的内存位置之间的微小间隙。)

齐:你没有问这个,但你应该知道,启用了异步取消的线程在官方上是不允许做纯计算以外的任何事情的。如果它调用pthread_cancelpthread_setcanceltype(PTHREAD_CANCEL_DEFERRED)pthread_setcancelstate(PTHREAD_CANCEL_DISABLE)以外的任何库函数,则该行为是未定义的。

票数 7
EN

Stack Overflow用户

发布于 2013-10-16 18:21:38

Q1。是的,线程可以自行取消。

Q2。如果一个线程取消了另一个线程,则其资源将被挂起,直到主线程使用pthread_join()函数加入该线程(如果该线程是可接合)。如果被取消的线程没有加入到主线程中,则通过程序结束/终止来释放资源。

Q3。我不确定,但是主程序不知道哪个线程被取消了。

票数 1
EN

Stack Overflow用户

发布于 2013-10-16 01:58:35

线程可以取消任何其他线程(在同一进程中),包括它自己

线程没有返回值(一般只能有返回值),取消后线程的资源将被释放

主程序可以存储线程的处理程序,并测试它是否有效

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19387873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档