pthread取消点用于什么?

8

有关pthread取消点(http://man7.org/linux/man-pages/man3/pthread_cancel.3.html)的讨论在多个问题中提到。在某些情况下,回答者表示,除非程序员非常清楚地知道自己在做什么,否则不应使用取消点。

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

[从评论中更新]

  1. 取消点是否允许取消这些特定的API调用?
  2. 为什么只有这些API?
  3. 是否有人会将它们用于其他目的?
  4. 它们是应对内核问题的一种解决方法,还是与POSIX有关的本质问题?
  5. 您想要在用户级代码中使用取消点还是只在API中使用?

你提供的文档至少在这个链接中回答了你的问题:http://man7.org/linux/man-pages/man7/pthreads.7.html(参见*Cancellaton Points*)。 - alk
文档说明这些函数必须是取消点,但它没有说明它们用于什么或者做了什么。 - vy32
请查看我在上面的评论中链接的链接。 - alk
我明白了!文档并不清晰。取消点是否允许取消那些特定的API调用?为什么只是这些而不是其他的?还有人想要将它们用于其他用途吗?它们是用来处理内核问题的一个hack,还是与POSIX相关的固有特性?在用户级代码中是否应该使用取消点,还是只在API中使用? - vy32
2个回答

8
取消点允许这些特定的API调用被取消吗?坚持使用PTHREAD_CANCEL_DEFERRED,这可能是混淆的中心。你几乎是反过来思考的。取消点并不允许系统调用(在您的术语中为API)被取消,而是检查调用是否有取消请求。在概念上,您可以将其视为(手动)设置开关。自动取消点将检查它是否生效,并且可以在方便或必要的地方插入有意的pthread_testcancel调用,例如在长时间运行的计算循环的中间,其中可能没有取消系统调用。取消点自动强制调用任何已设置并且可以以类似于atexit调用的方式链接的pthread清除处理程序。很多人选择(如果适用于他们的情况)设置自己的开关并编写一种在检查开关时关闭线程的方法。 PTHREAD_CANCEL_DEFERRED基本上就像那个开关的类固醇。它提供了(潜在的)几个点,其中该开关被概念化检查,从而迫使开发人员考虑在每个这些点被取消时的影响。
为什么是这些而不是其他?需要逐个调用进行讨论,但主要是因为具有不可预测的副作用。
你想在用户级代码中使用取消点还是只在API中使用?是的,你想在用户级代码中使用它们。您作为程序员最了解您正在使用哪些资源以及如何在线程被取消时清理它们以及在任何给定点上取消的逻辑含义。
PTHREAD_CANCEL_ASYNCHRONOUS是另一个问题。概念上,你几乎可以将其视为线程被kill信号炸毁 - 它可以在任何地方被中断 - 但它确实提供了运行清理处理程序的机会。问题是这很难做到,例如如果在malloc的中间取消怎么办?这使得它在一些非常仔细考虑的情况下几乎无用。

1
强调一下你最后的观点:在PTHREAD_CANCEL_ASYNCHRONOUS模式下的线程,如果调用除pthread_setcancelstatepthread_setcanceltypepthread_cancel之外的任何标准库函数,则会引发未定义行为。 - zwol
1
这是我读过的最清晰明了的英文描述。如果您能再扩展一些,对人们将会有很大帮助。 - Newton Falls

4

…pthread取消点有什么用?

man 7 pthreads 中了解到:

取消点

POSIX.1规定某些函数必须是取消点,而另一些函数可以是取消点。

更多信息:

如果线程是可取消的,其取消类型为延迟,且线程的取消请求处于挂起状态,则当该线程调用一个是取消点的函数时,该线程将被取消。

参考问题:

  1. 这里 POSIX 定义的 API 函数:http://man7.org/linux/man-pages/man7/pthreads.7.html (Cancellation Points) 要么 取消点,要么 可能是
  2. 如果您觉得有必要引入(用户)特定的取消点,请调用 pthread_testcancel()
  3. 不是。
  4. 它们由 POSIX 定义,提供了一种标准化的处理取消可能发生的方式。这对于阻塞函数尤其有意义。
  5. 见第 2 条。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接