什么是取消点?

时间:2014-12-09 08:49:04

标签: c++ cancellation

我试图了解c ++中的取消点究竟是什么。我读过:

man pageWhat are pthread cancellation points used for

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

但在我看来,这不是一个线程的取消,而只是一个临时的阻塞/暂停,并且没有线程“清理”可以做......

所以我的问题是,取消点是否与“阻塞点”有关? - 他们真的是一回事,还是有些不同? 对取消点的任何明确的“顶级”描述都非常有用。

2 个答案:

答案 0 :(得分:15)

当你的线程从执行中被拉出时,它的状态由操作系统保存,而不是取消线程。取消意味着根据请求线程终止,具体意图是在完成时让所有资源都处于最终状态(即所有资源都被释放,所有处理程序都被更新等)。

在中途取消时,您所谓的阻止可能发生在线程中。

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

当取消程序正在运行时,可以在操作系统看起来适合的情况下多次阻止该线程。

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

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

答案 1 :(得分:10)

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

  

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

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

  

POSIX.1指定某些功能必须,以及某些其他功能          功能可以是取消点。如果一个线程可以取消,          它的可取消性类型被推迟,取消请求是          等待线程,然后线程在调用时被取消          作为取消点的功能。

这些作为取消点的函数是否也可以阻止线程的执行,此时不相关。文档中列出了这些功能:

请注意,为简单起见,有些设置会影响我在此处遗漏的线程的行为和“可取消性”。进一步阅读: