C pthread取消点用于什么?
在几个问题上讨论了pthread取消点()。在某些情况下,受访者表示,除非程序员非常了解他们在做什么,否则不应使用取消点 我的问题——pthread取消点用于什么 [根据评论更新]C pthread取消点用于什么?,c,linux,pthreads,posix,C,Linux,Pthreads,Posix,在几个问题上讨论了pthread取消点()。在某些情况下,受访者表示,除非程序员非常了解他们在做什么,否则不应使用取消点 我的问题——pthread取消点用于什么 [根据评论更新] 取消点是否允许取消这些特定的API调用 为什么是这些而不是其他 有人想用它们做其他用途吗 它们是处理内核问题的黑客,还是POSIX固有的问题 您希望在用户级代码中使用取消点还是仅在API中使用取消点 。。。pthread取消点用于什么 发件人: 取消积分 POSIX.1指定某些函数必须 功能可能是取消点 更多: 如果
pthread\u cancel()
,使其能够正常关闭
取消点是否允许取消这些特定的API调用
坚持使用PTHREAD\u CANCEL\u DEFERRED,这可能是混乱的核心。你几乎是在倒行逆施。取消点不允许取消系统调用(术语中的API),这些调用检查取消请求是否挂起。从概念上讲,您可以将其视为(手动)设置开关。自动取消点将检查它是否有效,并且在方便或必要的情况下,可以方便地插入到<代码> pthRead TestCuffe>代码>,例如,在长时间运行的计算循环的中间,否则可能不会有可取消的系统调用。取消点自动强制调用任何已设置的pthread cleanup处理程序,这些处理程序可以以类似于atexit
调用的方式链接
很多人选择(如果对他们的情况可行的话)设置自己的开关,并在检查开关时在线程中的该点处编写关闭线程的方法。PTHREAD_CANCEL_DEFERRED基本上就是类固醇。它提供了(潜在的)几个点,其中开关在概念上被检查,从而也迫使开发者考虑每一个点被取消的含义。
为什么是这些而不是其他
您需要逐个电话讨论这个问题,但主要是因为不可预测的副作用
您希望在用户级代码中使用取消点还是仅在API中使用取消点
是的,您希望在用户级代码中使用它们。作为程序员,您最有可能知道您正在使用什么资源,以及在线程被取消时如何清理它们,以及在任何给定点取消的逻辑含义
PTHREAD_CANCEL_ASYNCHRONOUS本身就是另一个蜡球和噩梦。从概念上讲,您几乎可以将此视为线程被
kill
信号破坏-它可以在任何地方中断-但它确实为清理处理程序提供了运行的机会。问题是,它真的很难做到这一点,例如,如果在<代码> MALLC/<代码>的中间取消了什么?这使得它在一些真正、真正、仔细考虑过的情况之外几乎毫无用处。您链接的文档确实回答了您的问题,至少通过此链接:(参见Cancellaton Points)文档说明这些函数必须是取消点,但是它没有说它们是用来做什么的,或者它们是做什么的。请看我在上面的评论中链接的链接,我链接了!文件不清楚。取消点是否允许取消这些特定的API调用?为什么是这些而不是其他?有人想用它们做其他用途吗?它们是处理内核问题的黑客,还是POSIX固有的问题?您想在用户级代码中使用取消点还是仅在API中使用取消点?请强调最后一点:PTHREAD_CANCEL_异步模式下的线程如果调用除PTHREAD_setcancelstate
,PTHREAD_setcanceltype
以外的任何标准库函数,就会引发未定义的行为,或者pthread\u cancel
。这是我读过的最清晰的英文描述。如果你能扩展一点,这对人们会有很大的帮助。