Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
取消点是什么? 我试图让我知道C++中的一个精确的取消点。我读过:_C++_Cancellation - Fatal编程技术网

取消点是什么? 我试图让我知道C++中的一个精确的取消点。我读过:

取消点是什么? 我试图让我知道C++中的一个精确的取消点。我读过:,c++,cancellation,C++,Cancellation,及 但在某些方面我仍然有点困惑。例如,我正在使用file write()函数。显然这是一个取消点。因此,当我调用write()时,我可以看到另一个线程可能会开始处理(因此我的代码会从写入线程切换到另一个线程),这通常发生在写入缓冲区已满并且需要清空后,write()才能成功/完成 但在我看来,这并不是一个线程的取消,而是一个临时的阻塞/挂起,并且没有线程“清理”要做 所以我的问题是,取消点和“阻塞点”有关系吗它们真的是一样的东西,还是有什么不同? 任何关于取消点的清晰的“顶层”描述都非常有用。当

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

但在我看来,这并不是一个线程的取消,而是一个临时的阻塞/挂起,并且没有线程“清理”要做

所以我的问题是,取消点和“阻塞点”有关系吗它们真的是一样的东西,还是有什么不同?
任何关于取消点的清晰的“顶层”描述都非常有用。

当您想使用
pthread\u cancel()终止或取消另一个线程(例如,从主线程)中的线程时,会发生以下情况():

pthread\u cancel()
函数向线程发送取消请求

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

POSIX.1指定某些函数必须 功能可能是取消点。如果线程是可取消的, 其可取消性类型为延迟,取消请求为 线程挂起,然后当线程调用 作为取消点的函数。

这些作为取消点的函数是否也会阻止线程的执行,在这一点上并不相关。文档中有这些功能的列表:

请注意,有些设置可能会影响线程的行为和“可取消性”,为了简单起见,我在这里省略了这些设置。进一步阅读:


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

在取消过程中,线程可能会发生所谓的阻塞

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

当取消过程正在运行时,线程可以被阻塞多次,只要操作系统看起来合适

另外,如果您查看POSIX对取消点的要求,那么实际上所有阻塞接口都需要是取消点。否则,在任何完全阻塞的线程上(在这种调用中),将没有安全的方法终止该线程


取消点通常是控制流中控制返回到调度程序的任何点。“取消”的唯一可能含义是不再安排日程,因此只有在能够影响日程安排决策的情况下才能取消某些内容。系统调用与调度程序形成自然的交互,尽管可能还有其他的。@KerrekSB有了这个评论和Bogdan V的回答,我认为这对我来说真的很有意义,谢谢:)感谢@KerrekSB对调度程序的清晰、简洁和可靠的解释。啊,这更有意义。所以一个取消点实际上是用来取消线程的,但是它与“阻塞点”有着非直接的关系,因为,正如你所说的,否则你可能会得到“死锁”的线程,你甚至无法杀死它们。。。我想这回答了我的问题,也澄清了我的困惑:)从技术上讲,死锁的线程可以用pthread_kill杀死。目标线程将获得SIGKILL。但例如,线程本地存储中对象的析构函数将不会被调用。此外,在终止时,不能保证线程使用的内部结构将被释放。pthread_cancel是在您无法执行联接时执行此操作的“最干净”的方法。@BogdanV:如果您使用SIGKILL命中进程中的任何线程,则整个进程将死亡,而不仅仅是线程。它必须以这种方式工作,因为常规kill系统调用已经“随机”选择了一个目标线程,而pthread_kill只允许您选择发送信号的线程。POSIX:“请注意,pthread_kill()只会导致在给定线程的上下文中处理信号;信号操作(终止或停止)会影响整个进程。”感谢所有链接,我已经通读了其中的大部分内容,我认为我之所以困惑是因为我认为是“阻塞”这一点和其他答案为我澄清的取消点是一样的。仍然,+1表示所有信息:)