根据POSIX,如果原始承载线程结束,则可以重用线程ID。因此,在调用pthread_join()
时是否需要使用互斥锁或信号量?因为,在原始线程中调用pthread_join()
之前,可能会发生一个想要加入的目标线程已经终止并且创建了具有相同线程ID的另一个线程。这将使原始线程认为目标线程尚未完成,尽管事实并非如此。
答案 0 :(得分:2)
我认为你会发现这与UNIX中的进程非常相似。在某些实际加入之前,可连接的线程不被视为真正完成。
这类似于UNIX进程,即使它们在技术上已退出,但是有足够的状态信息(包括无法重用的PID)会挂起,直到另一个进程执行wait
为止它。只有在那之后,PID才可以重复使用。这种过程被称为僵尸,因为它死了但没死。
pthread_join documentation支持这一点:
无法加入可连接的线程(即未分离的线程)会产生“僵尸线程”。避免这样做,因为每个僵尸线程都会消耗一些系统资源,并且当累积了足够的僵尸线程时,将无法再创建新的线程(或进程)。
和pthread_create,其中说明:
只有当已加入已终止的可连接线程时,才会将其最后一个资源释放回系统。