什么是pthread取消点用于?

时间:2014-04-22 12:53:11

标签: c linux pthreads posix

在几个问题上讨论了pthread取消点(http://man7.org/linux/man-pages/man3/pthread_cancel.3.html)。在某些情况下,受访者表示除非程序员知道他们做得很好,否则不应使用取消点。

我的问题---什么是pthread取消点用于?

[从评论更新]

  1. 取消点是否允许取消这些特定的API调用?
  2. 为什么那些而不是其他人?
  3. 有人想将它们用于其他任何事情吗?
  4. 它们是处理内核中的问题的黑客,还是必须与POSIX有关的内容?
  5. 您是想在用户级代码中使用取消点还是仅在API中使用取消点?

2 个答案:

答案 0 :(得分:4)

  

取消点是否允许取消这些特定的API调用?

坚持使用PTHREAD_CANCEL_DEFERRED,这可能是混乱的中心。你几乎在想它倒退了。取消点不会允许系统调用(您的术语中的API)被取消,这些调用会检查取消请求是否未决。从概念上讲,您可以将其视为(手动)设置开关。自动取消点将检查它是否有效,并且可以在方便或必要时插入故意调用pthread_testcancel - 例如,在长时间运行的计算循环中,否则可能无法取消系统调用。取消点会自动强制调用已设置的任何pthread清理处理程序,并且可以以类似于atexit调用的方式链接。

许多人选择(如果它的情况可行)设置自己的开关和代码,当他们检查交换机时,在线程中的那一点关闭线程。 PTHREAD_CANCEL_DEFERRED基本上是类固醇。它(可能)提供了几个点,其中该开关在概念上进行检查,从而也迫使开发人员考虑在每个点上被取消的含义。

  

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

你需要在逐个电话的基础上讨论这个问题,但主要是因为不可预测的副作用。

  

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

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

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

答案 1 :(得分:3)

  

...什么是pthread取消点用于?

来自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。
  6. 作为最后一点:尽可能避免取消线程,因为这可能会导致程序出现意外和无法复制的行为。尝试始终设计一个程序,以便能够通过结束所有线程而无需显式调用pthread_cancel()来优雅地关闭它。