什么是取消点?

cod*_*der 16 c++ cancellation

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

手册页什么是pthread取消点用于

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

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

所以我的问题是,取消点是否与"阻塞点"有关? - 他们真的是一回事,还是有些不同?对取消点的清晰"顶级"描述将非常有用.

Bog*_* V. 16

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

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

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

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

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

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

  • 技术上死锁线程可能会被pthread_kill杀死.目标线程将获得SIGKILL.但是,例如,线程本地存储中的对象的析构函数将不会被调用.此外,当被杀死时,无法保证将释放用于该线程的内部结构.当你不进行连接时,pthread_cancel是"最干净"的方法. (3认同)
  • @BogdanV.:如果您使用 SIGKILL 命中进程中的任何线程,则整个进程都会终止,而不仅仅是线程。它必须以这种方式工作,因为常规的 Kill 系统调用已经“随机”选择了一个目标线程,而 pthread_kill 只是让您选择要向哪个线程发出信号。POSIX [明确记录这一点](http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_kill.html):“请注意,pthread_kill() 仅导致在给定线程的上下文中处理信号;信号动作(终止或停止)会影响整个过程。” (2认同)

moo*_*eep 13

当您想要从另一个线程(例如,从主线程)终止或取消线程时,使用pthread_cancel()以下命令发生(cf):

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

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

POSIX.1指定某些功能必须是,并且某些其他功能可能是取消点.如果一个线程是可取消的,它的可取消性类型是延迟的,并且该线程的取消请求正在等待,那么当它调用一个取消点的函数时该线程被取消.

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

请注意,有些设置可以影响我为简单起见而遗漏的线程的行为和"可取消性".进一步阅读: