gpt4 book ai didi

c - pthread 取消点有什么用?

转载 作者:IT王子 更新时间:2023-10-29 00:31:35 31 4
gpt4 key购买 nike

在几个问题上讨论了 pthread 取消点 ( http://man7.org/linux/man-pages/man3/pthread_cancel.3.html )。在某些情况下,受访者表示不应使用取消点,除非程序员非常清楚自己在做什么。

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

[根据评论更新]

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

最佳答案

Does a cancellation point allow those specific API calls to be canceled?

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

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

Why those and not others?

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

Would you want to use cancellation points in user-level code or just in APIs?

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

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

关于c - pthread 取消点有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23220206/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com