存在现有连接器时的 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 上的错误文件描述符

Oracle DB - 不存在匹配数据时的表连接问题

如果在已经返回的线程上调用pthread_detach会发生什么

Python pthread_detach 模拟

pthread_detach()与pthread_join的区别?

linux下多线程之pthread_detach(pthread_self())