在几个问题上讨论了pthread取消点(http://man7.org/linux/man-pages/man3/pthread_cancel.3.html)。在某些情况下,受访者表示除非程序员知道他们做得很好,否则不应使用取消点。
我的问题---什么是pthread取消点用于?
[从评论更新]
答案 0 :(得分:4)
取消点是否允许取消这些特定的API调用?
坚持使用PTHREAD_CANCEL_DEFERRED,这可能是混乱的中心。你几乎在想它倒退了。取消点不会允许系统调用(您的术语中的API)被取消,这些调用会检查取消请求是否未决。从概念上讲,您可以将其视为(手动)设置开关。自动取消点将检查它是否有效,并且可以在方便或必要时插入故意调用pthread_testcancel
- 例如,在长时间运行的计算循环中,否则可能无法取消系统调用。取消点会自动强制调用已设置的任何pthread清理处理程序,并且可以以类似于atexit
调用的方式链接。
许多人选择(如果它的情况可行)设置自己的开关和代码,当他们检查交换机时,在线程中的那一点关闭线程。 PTHREAD_CANCEL_DEFERRED基本上是类固醇。它(可能)提供了几个点,其中该开关在概念上进行检查,从而也迫使开发人员考虑在每个点上被取消的含义。
为什么那些而不是其他人?
你需要在逐个电话的基础上讨论这个问题,但主要是因为不可预测的副作用。
您是想在用户级代码中使用取消点还是仅在API中使用取消点?
是的,您希望在用户级代码中使用它们。作为程序员,你最好知道你正在使用什么资源,如果线程被取消,如何清理它们以及在任何给定点取消的逻辑含义。
PTHREAD_CANCEL_ASYNCHRONOUS是另一个蜡球和自己的噩梦。从概念上讲,您几乎可以将此视为由kill
信号引发的线程 - 它可以在任何地方中断 - 但它确实为清理处理程序提供了运行的机会。问题是很难做到这一点,例如如果在malloc
中间取消该怎么办?这使得它在一些非常非常仔细考虑的情况之外几乎无用。
答案 1 :(得分:3)
...什么是pthread取消点用于?
取消点
POSIX.1指定某些功能必须,以及某些其他功能 功能可以是取消点。
更多:
如果某个帖子可以取消, 它的可取消性类型被推迟,取消请求是 等待线程,然后线程在调用时被取消 作为取消点的功能。
参考问题:
pthread_testcancel()
。作为最后一点:尽可能避免取消线程,因为这可能会导致程序出现意外和无法复制的行为。尝试始终设计一个程序,以便能够通过结束所有线程而无需显式调用pthread_cancel()
来优雅地关闭它。