什么是pthread取消点用于?

关于几个问题,讨论了pthread取消点( http://man7.org/linux/man-pages/man3/pthread_cancel.3.html )。 在某些情况下,被调查者说除非程序员知道他们做得很好,否则不应使用取消点。

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

[从评论更新]

  1. 取消点是否允许取消那些特定的API调用?
  2. 为什么这些而不是其他人?
  3. 任何人都想使用他们的东西吗?
  4. 他们是在内核中解决问题的黑客攻击手段吗?或者他们是在POSIX系统中固有的东西?
  5. 你想在用户级代码中使用取消点还是只在API中使用取消点?

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

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

很多人选择(如果它适用于自己的情况)设置自己的开关,并在代码检查开关时在线程中关闭线程。 PTHREAD_CANCEL_DEFERRED基本上就是类固醇。 它提供了(可能的)几个要点,在这个点上,这个转换是在概念上检查的,从而也迫使开发者考虑在每一个点上被取消的含义。

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

您需要在逐个呼叫的基础上进行讨论,但主要是因为不可预知的副作用。

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

是的,你想在用户级代码中使用它们。 作为程序员,你是处于最好的位置,知道你正在使用什么资源,以及如果线程被取消以及在任何给定点取消的逻辑含义如何清除它们。

PTHREAD_CANCEL_ASYNCHRONOUS是另一个蜡球和自己的梦魇。 从概念上讲,你几乎可以把这个想法看作是线程被一个kill信号所kill – 它可以在任何地方被中断 – 但它确实为清除处理程序提供了运行的机会。 问题是,真的很难做到这一点,例如,如果它在malloc取消了呢? 这使得它在一些真正的,真正的,仔细考虑的情况之外几乎是无用的。

…什么是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()来正常关闭程序。