首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程取消点的用途是什么?

线程取消点的用途是什么?
EN

Stack Overflow用户
提问于 2014-04-22 12:53:10
回答 2查看 2.7K关注 0票数 8

有几个问题讨论了线程取消点(cancel.3.html)。在某些情况下,答复者说,除非程序员知道他们做的很好,否则不应该使用取消点。

我的问题

从评论中更新

  1. 取消点允许那些特定的API调用被取消吗?
  2. 为什么是那些而不是其他人?
  3. 还有人想用它们做别的吗?
  4. 它们是用来处理内核中的问题的黑客,还是与POSIX有关的固有问题?
  5. 您想要在用户级代码中还是仅在API中使用取消点?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-22 14:26:39

取消点允许那些特定的API调用被取消吗?

坚持使用PTHREAD_CANCEL_DEFERRED,这可能是混乱的中心。你几乎把它想反了。取消点不允许系统调用(命名中的API)被取消,调用检查取消请求是否挂起。从概念上来说,您可以认为这是(手动)设置开关。自动取消点将检查它是否有效,可以在方便或其他必要的地方插入对pthread_testcancel的故意调用--例如,在长时间运行的计算循环中,可能不会有其他可取消的系统调用。取消点会自动强制调用任何已设置且可以以类似于atexit调用的方式链接的线程清理处理程序。

很多人选择(如果对他们的情况可行的话)设置自己的开关,并在检查开关时在线程的那个点编写关闭线程的方法。PTHREAD_CANCEL_DEFERRED基本上就是用类固醇。它提供了(潜在的)几个点,其中的开关在概念上是检查的,因此也迫使开发人员考虑在这些点中的每个点被取消的影响。

为什么是那些而不是其他人?

您需要通过呼叫来讨论这个问题,但主要是因为无法预测的副作用。

您想要在用户级代码中还是仅在API中使用取消点?

是的,您希望在用户级代码中使用它们。作为程序员,您最好知道您正在使用哪些资源,以及在线程被取消时如何清理它们,以及在任何给定的点上取消这些资源的逻辑含义。

PTHREAD_CANCEL_ASYNCHRONOUS是另一个蜡球和它自己的噩梦。从概念上讲,您几乎可以认为这是一个被kill信号触发的线程--它可以在任何地方被中断--但是它确实为清理处理程序提供了运行的机会。问题是,要做到这一点真的很难,例如,如果它在malloc中间被取消了怎么办?这使得它在一些真的,真的,仔细考虑过的情况之外几乎毫无用处。

票数 8
EN

Stack Overflow用户

发布于 2014-04-22 14:00:44

..。线程取消点的用途是什么?

来自man 7 pthreads

取消点 POSIX.1指定某些函数必须是取消点,而某些其他函数可能是取消点。

更多信息:

如果一个线程是可取消的,那么它的可取消性类型就会被推迟,并且该线程的取消请求被挂起,那么当它调用一个作为取消点的函数时,该线程就会被取消。

关于这些问题:

  1. POSIX在这里定义的API函数:http://man7.org/linux/man-pages/man7/pthreads.7.html (取消点)要么是取消点,要么是可能是
  2. 要引入(用户)特定的取消点调用,请在您认为有必要的地方调用pthread_testcancel()
  3. 不是的。
  4. POSIX将其定义为提供一种标准的方法来处理可能发生的取消。这对于阻塞函数尤其有意义。
  5. 见2。

最后,请注意:尽可能避免取消线程,因为这可能导致程序的意外和不可复制的行为。尝试始终设计一个程序,以便能够通过结束所有线程而不显式调用pthread_cancel()来优雅地关闭它。

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

https://stackoverflow.com/questions/23220206

复制
相关文章

相似问题

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