什么是pthread取消点用于?

vy3*_*y32 7 c linux posix pthreads

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

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

[从评论更新]

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

Duc*_*uck 8

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

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

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

为什么是这些而不是其他?

您需要逐个讨论这个问题,但主要是因为不可预测的副作用。

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

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

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