【发布时间】:2015-09-24 19:10:03
【问题描述】:
在a recent question 的评论过程中,出现了一个附属问题,即在什么时候可以对具有可取消性PTHREAD_CANCEL_DEFERRED 的pthreads 线程的取消请求采取行动。对the standard 的引用和一些律师接踵而至。我不太关心我的 cmets 是否在这个问题上弄错了,但我想确保我正确理解了 POSIX 的规定。
标准中最相关的部分说
当一个线程启用了可取消性并且以该线程为目标发出了一个取消请求,然后该线程调用任何作为取消点的函数 [...],取消请求应在函数返回。如果线程启用了可取消性,并在线程在取消点挂起时以该线程为目标发出取消请求,则该线程将被唤醒并对取消请求进行处理。
但是,线程被“暂停”是什么意思? POSIX 明确定义了进程的术语,但据我所知,没有定义线程的术语。另一方面,POSIX 将线程挂起记录为少数函数的行为之一,包括但不限于与同步对象相关的一些函数。那么是否应该得出结论,这些共同作为该术语的相关定义?
由于这一切都与引发此查询的问题有关,鉴于 POSIX 并未将线程暂停指定为 read()、fread() 或任何一般文件或流 I/ 的行为的一部分O 函数,如果一个线程由于 I/O 阻塞而没有进展,这是否一定意味着它为了取消的目的而被“挂起”?
【问题讨论】:
-
IEEE 1003.1 (POSIX) 标准明确声称它符合 ISO/IEC 9899 (C) 标准。 C 标准引用了ISO/IEC 2382 (Information Technology Vocabulary) 的术语。不幸的是,甚至 ISO/IEC 2382 都没有定义suspended,甚至在某些定义中使用了这个词。我从中得出的结论是,“suspended”被认为是一个核心英语单词,适合用于解释。我个人对挂起的解释是“当前未使用处理器时间的线程的状态”。
-
@IwillnotexistIdonotexist,与 C 的对齐是一个有用的观察,谢谢。然而,我发现“当前未使用处理器时间”是一个令人不安的解释,因为它似乎涵盖了可能正在运行但已被抢占的线程。这似乎不匹配 - 每个迹象都表明线程暂停是一种线程被阻止运行的状态,即使 CPU 本来可以用于它。确实可能是 C 和 POSIX 标准假定应该应用自然解释,但细节很重要,而且它们不清楚(对我来说)。
-
我很自然地认为没有运行的可运行线程因为缺乏更好的词而被暂停。在负载很重的
n-core 处理器上,可能有>nrunnable 进程,但最多可以使其中的nrunnable;所有其他人都必须未运行,或者按照POSIX可能的规定,“他们的执行被暂停”等待轮到他们。你怎么看?等待正在运行的线程的时间段到期的可运行线程是否已挂起?一个运行中的线程,其量程到期,即使仍然可以运行,也被关闭了呢?断点线程呢? -
POSIX 的Definitions 具有以下优点:3.281 抢占进程(或线程):A由于另一个线程变得可以以更高的优先级运行而导致其执行被挂起的正在运行的线程。 3.287 优先级反转:非自愿挂起(等待事件或时间延迟)的线程未运行而低优先级线程正在运行的情况。这种较高优先级线程的阻塞通常是由共享资源的争用引起的。
-
“等待事件或时间延迟”似乎很有帮助。
aio_suspend函数的描述开始,aio_suspend()函数将暂停调用线程,直到列表参数引用的至少一个异步 I/O 操作完成,直到一个信号中断函数,或者,如果 timeout 不为 NULL,直到 timeout 指定的时间间隔已经过去。 我只能同意“暂停”的预期定义是“暂停/中断”,没有更正式的定义到位。
标签: c posix language-lawyer