如何检查 pthread 是否可连接?

how to check if a pthread is joinable?

我知道我可以创建一个具有可连接属性集的 pthread,但是一旦创建,

  1. 我说得对吗,我也可以将该 pthread 更改为分离线程 pthread?
  2. 如果是这样,我如何检查 pthread 是否可连接?以及如何将 pthread 从可连接更改为可分离?
  1. 是的,你可以。只需在线程上调用 pthread_detach()
  2. 您有多种选择。

一个。如果您已经启动了指定 pthread_attr 的线程,并且此 pthread_attr 仍然存在,您可以通过调用 pthread_attr_getdetachstate 可靠地检查可加入状态。如果 pthread_attr 不可用,而您在 Linux,您可以通过调用 pthread_getattr_np 重新查询属性 - 请注意,_np 表示 non-Posix,因此这可能是 Linux-only.

b。您可以简单地尝试加入它。不可连接的 pthread 通常会 return EINVAL。这不是 POSIX 的标准,但是您可以依赖 Linux - 以及 Solaris 和可能的其他主要系统。

c。最简单的选择是自己简单地跟踪您的线程,这样您将始终通过检查您的程序状态就知道特定线程是否可连接。

am I right that I can also change that pthread to a detached pthread?

是的,没错。

If that's the case, how can I check if a pthread is joinable?

你不能,要求这样做没有任何意义。除非您有一个可连接的 pthread,并且您知道该 pthread 尚未被连接,否则没有 pthread 供您检查。分离或连接的 pthread 可能不再存在,因此没有 "a pthread" 供您检查。

无法检查实际上可能是线程或可能不是线程的事物是否是线程。提出其他建议的人要求您依赖没有保证的行为,那将是极其愚蠢的。

And how can I change a pthread from joinable to detached?

您可以随时通过调用 pthread_detach 将其分离,或者它可以自行分离。最常见的模式是某物拥有线程,并且该物负责在线程完成(或关闭)时加入线程。如果您只想让一个线程 运行 在没有任何监督或所有权的情况下完成,请将其分离或让它自行分离。