究竟什么是取消点

What exactly is a cancellation point?

本文关键字:取消 什么 究竟      更新时间:2023-10-16

我试图弄清楚 c++ 中的取消点到底是什么。我读过:

手册页和 pthread 取消点的用途是什么

但我在某些方面仍然有点困惑。例如,我正在使用文件 write(( 函数。显然这是一个取消点。所以当我调用 write(( 时,我可以看到另一个线程可能会开始处理(所以我的代码从写入线程切换到另一个线程(,这通常发生在写入缓冲区已满并且需要在 write(( 成功/完成之前清空时。

但在我看来,这不是取消线程,而只是暂时阻塞/挂起,没有线程"清理"要做......

所以我的问题是,取消点与"阻塞点"有关吗?——它们真的是一回事,还是有一些区别?任何关于取消点是什么的清晰"顶级"描述都将非常有用。

当您的线程从执行中拉出时,操作系统会保存其状态,这不是线程的取消。取消意味着根据请求终止线程,其具体目的是让所有内容在完成后处于最终状态(即释放所有资源,更新所有处理程序等(。

您所谓的阻塞可能会在取消过程中发生在线程上。

示例:线程收到取消请求。操作系统将其排队,直到线程变得可取消。当线程变得可取消,并且线程正在执行取消点时,可以清理和取消线程。写入函数是一个取消点,这意味着从操作系统的角度来看,在执行此函数时取消线程是安全的(所有相关资源的状态将是一致的(。

在取消过程运行时,可以根据操作系统认为合适的次数多次阻止线程。

另外,如果您查看取消点的 POSIX 要求,几乎所有阻塞接口都需要是取消点。否则,在任何完全阻塞的线程上(在此类调用中(,将没有安全的方法终止该线程。

http://man7.org/linux/man-pages/man7/pthreads.7.html

当您想终止或取消来自另一个线程(例如,从主线程(的线程时,pthread_cancel()会发生以下情况 (c.f.(:

pthread_cancel()函数向线程线程发送取消请求。

目标线程不会立即终止,而是在到达取消点 (c.f.( 时终止:

POSIX.1 指定某些函数必须,而某些其他函数必须 功能可能是取消点。 如果线程可取消, 其可取消性类型为"延迟",取消请求为 挂起线程,则线程在调用 作为取消点的功能。

作为取消点的这些函数是否也会阻止线程的执行,此时无关紧要。文档中列出了这些函数:

  • http://man7.org/linux/man-pages/man7/pthreads.7.html

请注意,有些设置可能会影响线程的行为和"可取消性",为了简单起见,我在这里省略了这些设置。进一步阅读:

  • http://man7.org/linux/man-pages/man7/pthreads.7.html
  • http://man7.org/linux/man-pages/man3/pthread_cancel.3.html
  • http://man7.org/linux/man-pages/man3/pthread_setcancelstate.3.html
  • http://man7.org/linux/man-pages/man3/pthread_testcancel.3.html