究竟什么是取消点
What exactly is a cancellation point?
我试图弄清楚 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
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- 在 C++ 中取消引用字符串时会发生什么情况
- 创建关闭GTK+对话框的取消按钮的正确方法是什么
- 取消引用超出范围的矢量迭代器 - 什么适合以及为什么
- 通过函数指针调用函数 - 是否取消引用指针?有什么区别?
- 在此地图中,取消运算符的目的和功能是什么
- 取消parallel_for最有效的方法是什么
- 带取消引用和不带取消引用的函数有什么区别
- 取消绑定此指针有什么问题
- 在什么条件下调用常量取消引用运算符
- 如果队列为空,取消排队应返回什么
- 具有 O(1) 取消排队和 O(无论什么)排队的优先级队列
- 究竟什么是取消点
- 如果根本不使用单个取消引用运算符,指向指针的指针打印什么值
- 将迭代器取消引用到映射或 C++ 中的某些其他复合类型的类型是什么
- 取消引用不返回的函数时会发生什么情况?
- 避免在使用"new"关键字后不断取消引用的标准方法是什么?
- 在c++中编写取消操作背后的概念是什么?
- 当我取消注释移动构造函数 A(A&&) 时,下面的代码段会发生什么?