【问题标题】:What are pthread cancelation points used for?pthread 取消点有什么用?
【发布时间】:2014-06-06 20:44:18
【问题描述】:

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

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

[根据评论更新]

  1. 取消点是否允许取消那些特定的 API 调用?
  2. 为什么是那些而不是其他?
  3. 有人愿意将它们用于其他用途吗?
  4. 它们是用来解决内核问题的黑客,还是它们与 POSIX 相关的东西?
  5. 您想在用户级代码中还是仅在 API 中使用取消点?

【问题讨论】:

  • 您链接的文档确实回答了您的问题,至少通过以下链接:man7.org/linux/man-pages/man7/pthreads.7.html(请参阅取消积分
  • 文档说这些函数必须是取消点,但没有说明它们的用途或作用。
  • 查看我在上面评论中链接的链接。
  • 我做到了!文档不清楚。取消点是否允许取消那些特定的 API 调用?为什么是那些而不是其他?有人愿意将它们用于其他用途吗?它们是处理内核问题的技巧,还是它们与 POSIX 相关?您想在用户级代码中还是仅在 API 中使用取消点?

标签: c linux pthreads posix


【解决方案1】:

... 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。

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 只是为了强调您的最后一点:如果线程在 PTHREAD_CANCEL_ASYNCHRONOUS 模式下调用除pthread_setcancelstatepthread_setcanceltype 或@987654327 之外的任何标准库函数,则会引发未定义的行为@.
    • 这是我读过的最清晰的简单英文描述。如果你能扩展一点,它可能对人们有很大的帮助。
    猜你喜欢
    • 2014-04-14
    • 2015-02-07
    • 2010-09-30
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多