gpt4 book ai didi

c - 线程为 "suspended"对 POSIX 意味着什么?

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

评论过程中a recent question , 出现了一个附属问题,即在什么时候可以预期对具有可取消性 PTHREAD_CANCEL_DEFERRED 的 pthreads 线程的取消请求采取行动。引用 the standard随后进行了一些律师工作。我不太关心我对那个问题的评论是否有误,但我确保我正确理解了 POSIX 的规定。

标准中最相关的部分说

Whenever a thread has cancelability enabled and a cancellation request has been made with that thread as the target, and the thread then calls any function that is a cancellation point [...], the cancellation request shall be acted upon before the function returns. If a thread has cancelability enabled and a cancellation request is made with the thread as a target while the thread is suspended at a cancellation point, the thread shall be awakened and the cancellation request shall be acted upon.

但是,线程被“挂起”意味着什么? POSIX 明确定义了进程的术语,但据我所知,没有为线程定义术语。另一方面,POSIX 将线程挂起记录为少数函数的行为之一,包括但不限于一些与同步对象相关的函数。那么是否应该得出结论,这些共同作为该术语的相关定义?

鉴于 POSIX 没有将线程挂起指定为 read() 行为的一部分,因此这一切都与产生这一行查询的问题有关,fread() 或任何通用文件或流 I/O 函数,如果线程由于 I/O 阻塞而没有取得进展,是否一定意味着它出于取消目的而被“暂停”?

最佳答案

如您所说,挂起线程是在套接字读取、等待信号量可用等时被阻塞的线程。

鉴于 POSIX 实现在棘手的边缘有所不同,并且线程有可能在不是取消点的函数中被阻塞,可能依赖于要移植的代码中的取消可能麻烦多于它的值(value)。

我从未使用过它,我总是选择使用代码来显式指示线程终止(通常是管道或队列中的消息)。这对于通信顺序进程或参与者模型系统来说非常容易。

这样清理可以在自己的控制下完成,根据需要释放内存等。我不知道取消的线程是否会清理它的内存(我怀疑不会),或者是否有 at_exit() 类型的选项(可能有)。总的来说,我认为如果线程只有一种退出方式,应用程序行为会得到更彻底的控制。

==编辑==

@JohnBollinger,

使用的语言 如果一个线程启用了可取消性,并且当线程在取消点挂起时以该线程为目标发出取消请求 可以解释为 IF a thread启用了可取消性并且如果取消并且如果实现挂起阻塞的线程并且如果线程被阻塞那么线程应该被唤醒......。换句话说,他们将其留给 POSIX 子系统的实现者。

Cygwin 的 select() 实现不会(或至少不会)导致线程被挂起。相反,它会为每个文件描述符生成一个轮询线程来测试可信号事件,因为在 Windows 中根本缺少任何类似于 select() 的东西(它接近,但没有雪茄。Win32 select() 仅适用于套接字)。 1980 年代的 select() 实现也经常以这种方式工作。

可能正是出于这样的原因,POSIX 才不愿意明确定义线程何时被挂起。从历史上看,许多 select() 的实现都是这样的,这使得它成为标准委员会决定何时暂停或不暂停线程的雷区。当然,由 select() 引起的复杂性也适用于进程,但由于 POSIX 确实定义了一个挂起的进程,所以他们不能/没有将定义扩展到线程似乎确实很奇怪。

这可能取决于线程是如何实现的;你可以想象有一个不使用操作系统线程的 POSIX 实现(有点像 ADA 在操作系统根本不使用线程的日子里的早期实现),并且在这样的实现中,阻塞的线程可能不会被挂起(在不占用 CPU 周期的意义上)。

关于c - 线程为 "suspended"对 POSIX 意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32769098/

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