我试图了解c ++中的取消点究竟是什么.我读过了:
但我在某些方面仍然有点困惑.例如,我正在使用文件write()函数.显然这是一个取消点.因此,当我调用write()时,我可以看到另一个线程可能开始处理(所以我的代码从写入线程切换到另一个线程),这通常发生在写入缓冲区已满并需要在写入之前清空时()可以成功/完成.
但在我看来,这不是一个线程的取消,而只是一个临时的阻塞/暂停,并没有线程"清理"做...
所以我的问题是,取消点是否与"阻塞点"有关? - 他们真的是一回事,还是有些不同?对取消点的清晰"顶级"描述将非常有用.
Bog*_* V. 16
当你的线程从执行中被拉出时,它的状态由操作系统保存,而不是取消线程.取消意味着根据请求线程终止,其具体意图是在完成时让所有资源都处于最终状态(也就是说,所有资源都被释放,所有处理程序都被更新等).
在中途取消时,您所谓的阻止可能发生在线程中.
示例:线程获取取消请求.操作系统将其排队,直到线程变为可取消.当线程变得可取消,并且线程正在执行取消点时,可以清除和取消线程.该写入功能是取消点,这意味着它是从视OS的安全点,而这个功能是执行(所有相关资源的状态将是一致的)取消线程.
在取消过程正在运行时,可以在操作系统看起来适合的情况下多次阻止线程.
另外需要注意的是,如果您查看POSIX对取消点的要求,几乎所有的阻塞接口都必须是取消点.否则,在任何完全阻塞的线程上(在这样的调用中),将没有安全的方法来终止该线程.
http://man7.org/linux/man-pages/man7/pthreads.7.html
moo*_*eep 13
当您想要从另一个线程(例如,从主线程)终止或取消线程时,使用pthread_cancel()以下命令发生(cf):
该
pthread_cancel()函数向线程线程发送取消请求.
目标线程不会立即终止,而是在到达取消点时(cf):
POSIX.1指定某些功能必须是,并且某些其他功能可能是取消点.如果一个线程是可取消的,它的可取消性类型是延迟的,并且该线程的取消请求正在等待,那么当它调用一个取消点的函数时该线程被取消.
这些作为取消点的函数是否也可以阻止线程的执行,此时不相关.文档中列出了这些功能:
请注意,有些设置可以影响我为简单起见而遗漏的线程的行为和"可取消性".进一步阅读: