首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程“挂起”对POSIX意味着什么?

线程“挂起”对POSIX意味着什么?
EN

Stack Overflow用户
提问于 2015-09-24 19:10:03
回答 3查看 698关注 0票数 8

在对最近的一个问题的评论过程中,出现了一个次要的问题,即在什么时候可以对具有可取消性的PTHREAD_CANCEL_DEFERRED的线程执行取消请求。引用标准和一些律师接踵而至。我并不特别担心我对这个问题的评论是否有误,但我想确定我对POSIX条款的理解是正确的。

标准中最相关的部分是

每当线程启用可取消性并以该线程为目标发出取消请求,然后该线程调用任何作为取消点的函数.,则应在函数返回之前对取消请求进行操作。如果线程启用了可取消性,并且在取消点挂起线程时以线程为目标提出取消请求,则将唤醒线程并对取消请求进行操作。

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

由于这一切都与产生这条查询线的问题有关,考虑到POSIX没有将线程挂起指定为read()fread()或任何常规文件或流I/O函数的一部分,如果线程由于I/O上的阻塞而没有取得进展,这是否一定意味着为了取消而“挂起”?

EN

回答 3

Stack Overflow用户

发布于 2015-09-24 20:02:25

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

考虑到POSIX实现在棘手的边缘不同,并且有可能在不是取消点的函数中阻止线程,那么在要移植的代码中依赖取消可能会带来比它更大的麻烦。

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

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

==EDIT==

@JohnBollinger,

使用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的语言可以解释为IF a thread has cancelability enabled AND IF cancelled and IF implementation suspends blocked threads AND IF the thread is blocked THEN the thread shall be awakened...。换句话说,他们把它留给了POSIX子系统的实现者。

Cygwin的select()实现不会(或至少没有)导致线程被挂起。相反,它会为每个文件描述符生成一个轮询线程,以测试是否有信号活动,这是因为在Windows中根本没有类似select()的东西(它接近了,但没有雪茄)。Win32 select()只适用于套接字)。早在上世纪80年代,select()的实现也经常是这样工作的。

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

这可能取决于线程是如何实现的;可以想象,POSIX实现不使用OS线程(有点像OSes完全不执行线程时的早期ADA实现),而在这种实现中,阻塞的线程可能根本不会被挂起(在不占用CPU周期的意义上)。

票数 3
EN

Stack Overflow用户

发布于 2015-09-24 19:58:21

线程上下文中暂停的定义: 3.107条件变量 一种同步对象,它允许线程反复挂起执行,直到相关谓词变为真为止。其执行挂起在条件变量上的线程被称为在条件变量上被阻塞。

来自:http://pubs.opengroup.org/onlinepubs/9699919799/

这不是一个直接的回答,只是一个定义--太大了,不能发表评论。阻断==暂停。

票数 2
EN

Stack Overflow用户

发布于 2015-09-24 19:54:11

read、fread和friends都是系统调用,因此它们将从内核上下文执行上下文切换和执行,直到这些函数完成为止。中断内核上下文超出了线程的范围,因此它们不会导致取消。

我没有它的引用,但据我所知,Posix线程上下文中的线程挂起与它的同步对象(比如futex )有关。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32769098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档