gpt4 book ai didi

linux - POSIX 线程何时取消不立即?

转载 作者:太空狗 更新时间:2023-10-29 11:29:40 25 4
gpt4 key购买 nike

POSIX 为线程取消类型指定了两种类型:PTHREAD_CANCEL_ASYNCHRONOUSPTHREAD_CANCEL_DEFERRED(由pthread_setcanceltype(3) 设置)确定何时pthread_cancel(3) 应该生效。根据我的阅读,POSIX 手册页对这些内容的说明不多,但 Linux 手册页对 PTHREAD_CANCEL_ASYNCHRONOUS 说了以下内容:

The thread can be canceled at any time. (Typically, it will be canceled immediately upon receiving a cancellation request, but the system doesn't guarantee this.)

我很好奇系统不保证是什么意思。我可以很容易地想象这种情况发生在多核/多 CPU 系统中(在上下文切换之前)。但是单核系统呢:

  1. 我们能否在请求取消并启用取消 (pthread_setcancelstate(3)) 并将取消类型设置为 PTHREAD_CANCEL_ASYNCHRONOUS 时不立即取消线程?
  2. 如果是,在什么条件下会发生这种情况?

我主要对 Linux (LinuxThreads/NPTL) 感到好奇,但更普遍地对查看此取消业务的符合 POSIX 标准的方式感到好奇。

更新/澄清:这里真正的实际问题是调用 pthread_cancel() 后立即销毁的资源的使用,其中目标线程已启用取消并设置为类型PTHREAD_CANCEL_ASYNCHRONOUS!!!所以关键是:在这种情况下,被取消的线程是否有可能在上下文切换后继续正常运行(即使是很短的时间)?

感谢 Damon 的回答,减少了与下一个上下文切换相关的信号传递和处理的问题。

Update-2:我回答了我自己的问题,指出这是一个不好的问题,底层程序设计应该在根本不同的概念层面上解决。我希望这个“错误”的问题对其他想了解异步取消之谜的人有用。

最佳答案

意思就是它所说的:不能保证立即发生。这样做的原因是在标准中需要并说明实现细节的一定“自由度”。

例如在Linux/NPTL下,取消是通过发送信号nr来实现的。 32. 当接收到信号时线程被取消,这通常发生在下一次内核到用户的切换,或下一次中断,或时间片结束时(这可能不小心立即,但通常不是)。但是,当线程未运行时,永远不会收到信号。所以这里真正要注意的是,信号不一定会立即收到。

如果您考虑一下,甚至不可能做很多不同的事情。由于您可以phtread_cleanup_push 一些操作系统必须执行的处理程序(它不能直接炸毁线程不存在!),线程必须必须运行才能被取消。无法保证任何特定线程(包括您要取消的线程)在您取消线程的确切时间正在运行,因此无法保证它会立即被取消。
当然,假设地,如果操作系统以阻塞调用线程并安排要取消的线程的方式实现,那么它会执行它的处理程序,然后只解除阻塞 pthread_cancel。但是由于 pthread_cancel 没有被指定为阻塞,这将是一个非常令人讨厌的惊喜。由于会干扰执行时间限制和调度程序的公平性,这在某种程度上也是 Not Acceptable 。

所以,要么你的取消类型是“禁用”,那么什么也不会发生。或者,它是“enable”,并且取消类型是“deferred”,则线程在调用pthreads(7)中列为取消点的函数时取消。
或者,它是“异步的”,那么如上所述,操作系统会在它认为合适的时候做“某事”来取消线程——不是在一个精确的、定义明确的时间,而是“很快”。对于 Linux,通过发送信号。

关于linux - POSIX 线程何时取消不立即?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17719933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com