pthread_detach 存在现有加入者时的行为
pthread_detach behavior when there is an existing a joiner
我对 POSIX 线程实现比较陌生,我有一个我不确定的极端情况行为。
根据我的理解,可以在可连接的 pthread 上调用 pthread_deatch() 以将其标记为分离。
线程被分离后,它不需要等待有人加入才能让系统释放它的资源。
我的问题是,如果一个可连接线程(我们称它为线程 B)在创建线程 B 后被一个线程(我们称它为线程 A)连接怎么办。我们还假设当线程 A 加入时线程 B 正在执行,从而导致线程 A 挂起,直到线程 B 完成执行。同时,线程 C 在线程 B 上调用了 pthread_deatch()。
在这种情况下,处于挂起状态等待线程 B 完成的线程 A 会发生什么情况。线程 B 会继续执行,然后唤醒线程 A 来获取 B 的 return 值吗?还是一旦线程 B 被标记为分离,线程 A 就被唤醒?
POSIX description for pthread_join()
说:
The behavior is undefined if the value specified by the thread
argument to pthread_join()
does not refer to a joinable thread.
如果您在正在加入另一个线程的线程上调用 pthread_deatch()
,则该线程不再可加入,因此 pthread_join()
的行为变得不确定。
换句话说,这是不允许的。
如果您发现需要唤醒加入的线程 "early" 那么您可以对其使用线程取消(pthread_join()
是一个取消点)或者为其设置一个条件变量以等待而不是 pthread_join()
.
我对 POSIX 线程实现比较陌生,我有一个我不确定的极端情况行为。
根据我的理解,可以在可连接的 pthread 上调用 pthread_deatch() 以将其标记为分离。
线程被分离后,它不需要等待有人加入才能让系统释放它的资源。
我的问题是,如果一个可连接线程(我们称它为线程 B)在创建线程 B 后被一个线程(我们称它为线程 A)连接怎么办。我们还假设当线程 A 加入时线程 B 正在执行,从而导致线程 A 挂起,直到线程 B 完成执行。同时,线程 C 在线程 B 上调用了 pthread_deatch()。
在这种情况下,处于挂起状态等待线程 B 完成的线程 A 会发生什么情况。线程 B 会继续执行,然后唤醒线程 A 来获取 B 的 return 值吗?还是一旦线程 B 被标记为分离,线程 A 就被唤醒?
POSIX description for pthread_join()
说:
The behavior is undefined if the value specified by the
thread
argument topthread_join()
does not refer to a joinable thread.
如果您在正在加入另一个线程的线程上调用 pthread_deatch()
,则该线程不再可加入,因此 pthread_join()
的行为变得不确定。
换句话说,这是不允许的。
如果您发现需要唤醒加入的线程 "early" 那么您可以对其使用线程取消(pthread_join()
是一个取消点)或者为其设置一个条件变量以等待而不是 pthread_join()
.