C pthread取消点用于什么?

C pthread取消点用于什么?,c,linux,pthreads,posix,C,Linux,Pthreads,Posix,在几个问题上讨论了pthread取消点()。在某些情况下,受访者表示,除非程序员非常了解他们在做什么,否则不应使用取消点 我的问题——pthread取消点用于什么 [根据评论更新] 取消点是否允许取消这些特定的API调用 为什么是这些而不是其他 有人想用它们做其他用途吗 它们是处理内核问题的黑客,还是POSIX固有的问题 您希望在用户级代码中使用取消点还是仅在API中使用取消点 。。。pthread取消点用于什么 发件人: 取消积分 POSIX.1指定某些函数必须 功能可能是取消点 更多: 如果

在几个问题上讨论了pthread取消点()。在某些情况下,受访者表示,除非程序员非常了解他们在做什么,否则不应使用取消点

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

[根据评论更新]

  • 取消点是否允许取消这些特定的API调用
  • 为什么是这些而不是其他
  • 有人想用它们做其他用途吗
  • 它们是处理内核问题的黑客,还是POSIX固有的问题
  • 您希望在用户级代码中使用取消点还是仅在API中使用取消点
  • 。。。pthread取消点用于什么

    发件人:

    取消积分

    POSIX.1指定某些函数必须 功能可能是取消点

    更多:

    如果线程是可取消的, 其可取消性类型为延迟,取消请求为 线程挂起,则线程在调用 作为取消点的函数

    关于问题:

  • POSIX在此定义的API函数:(取消点)要么取消点,要么可能是一些
  • 在您认为有必要的地方引入(用户)特定的取消点呼叫
  • 没有
  • POSIX定义了它们,以提供一种标准化的方式来处理取消可能发生的方式。这对于阻塞函数尤其有意义
  • 见第2条
  • 最后要注意的是:尽可能避免取消线程,因为这可能导致程序的意外和不可生产的行为。尝试总是设计一个程序,通过结束所有线程而不显式调用
    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
    。这是我读过的最清晰的英文描述。如果你能扩展一点,这对人们会有很大的帮助。