我试图了解c ++中的取消点究竟是什么。我读过:
man page和What are pthread cancellation points used for
但我在某些方面仍然有些困惑。例如,我正在使用文件write()函数。显然这是一个取消点。因此,当我调用write()时,我可以看到另一个线程可能开始处理(所以我的代码从写入线程切换到另一个线程),这通常发生在写入缓冲区已满并需要在写入之前清空时()可以成功/完成。
但在我看来,这不是一个线程的取消,而只是一个临时的阻塞/暂停,并且没有线程“清理”可以做......
所以我的问题是,取消点是否与“阻塞点”有关? - 他们真的是一回事,还是有些不同? 对取消点的任何明确的“顶级”描述都非常有用。
答案 0 :(得分:15)
当你的线程从执行中被拉出时,它的状态由操作系统保存,而不是取消线程。取消意味着根据请求线程终止,具体意图是在完成时让所有资源都处于最终状态(即所有资源都被释放,所有处理程序都被更新等)。
在中途取消时,您所谓的阻止可能发生在线程中。
示例:线程获取取消请求。操作系统将其排队,直到线程变为可取消。当线程变得可取消,并且线程正在执行取消点时,可以清除和取消线程。 写入功能是一个取消点,这意味着从操作系统的角度来看,在执行此功能时取消线程是安全的(所有相关资源的状态将保持一致)。
当取消程序正在运行时,可以在操作系统看起来适合的情况下多次阻止该线程。
另外需要注意的是,如果查看POSIX对取消点的要求,几乎所有的阻塞接口都必须是取消点。否则,在任何完全阻塞的线程上(在这样的调用中),将没有安全的方法来终止该线程。
答案 1 :(得分:10)