存在现有连接器时的 pthread_detach 行为
Posted
技术标签:
【中文标题】存在现有连接器时的 pthread_detach 行为【英文标题】:pthread_detach behavior when there is an existing a joiner 【发布时间】:2016-06-16 22:52:18 【问题描述】:我对 POSIX 线程实现相对较新,并且我有一个我不确定的极端情况行为。
据我了解,可以在可连接的 pthread 上调用 pthread_deatch() 以将其标记为已分离。
线程分离后,不需要等待有人加入,系统就可以释放它的资源。
我的问题是,如果在创建线程 B 之后,一个可连接线程(我们称之为线程 B)被一个线程(我们称之为线程 A)连接了怎么办。我们还假设当线程 A 加入时线程 B 正在执行中,因此导致线程 A 被挂起,直到线程 B 完成执行。同时线程 C 在线程 B 上调用了 pthread_deatch()。
在这种情况下,处于挂起状态等待线程 B 完成的线程 A 应该发生什么。线程 B 会继续执行,然后线程 A 会被唤醒以获取 B 的返回值吗?或者线程 B 被标记为分离后是否立即唤醒线程 A?
【问题讨论】:
【参考方案1】:POSIX description for pthread_join()
说:
如果
thread
指定的值,则行为未定义pthread_join()
的参数不引用可连接线程。
如果您在正在加入另一个线程的线程上调用pthread_deatch()
,则该线程不再可加入,因此pthread_join()
的行为变得未定义。
换句话说,这是不允许的。
如果你发现你需要“提前”唤醒加入线程,那么你可以使用线程取消(pthread_join()
是一个取消点)或者设置一个条件变量让它等待而不是@987654328 @。
【讨论】:
以上是关于存在现有连接器时的 pthread_detach 行为的主要内容,如果未能解决你的问题,请参考以下文章
如果在已经返回的线程上调用pthread_detach会发生什么