当你使用线程,并且线程运行终止但没有分离时,它处于僵尸状态,等待通过连接获得或被分离,以便可以清除其资源。 / p>
我读到当线程是僵尸时未清理的两个'资源'是堆栈和返回值。
有人可以告诉我允许堆栈持续到加入之前的逻辑吗?如果返回值有一个单独的位置,我想不出一个很好的理由 - 但我确定有一个,我想知道它何时使用线程。
答案 0 :(得分:4)
保持堆栈存活的技术实现更容易。即使从调度程序取消注册当前线程,您的线程实现也可以使用堆栈的底部作为工作空间。之后,调用join()
的线程的上下文可用于删除空格。
如果要在join()
之前删除堆栈 - 也就是说,在终止线程的上下文中 - 在堆栈删除和线程取消注册之间的短时间内没有堆栈或其他内存。
答案 1 :(得分:3)
线程退出后是否回收堆栈取决于操作系统。
以下主题是一个很好的读物:link。
我发现Roger Faulkner的以下帖子非常有趣:
至少在Solaris 9和10中,由...分配的线程堆栈 该 库(使用mmap())被释放,以便在线程上立即重用 终止。线程结构,包含thread-id和 返回值,直到pthread_join()(或pthread_detach())才被释放。
保留最多10个线程堆栈的缓存,以便快速重用新的 线程。超出缓存限制的旧堆栈是munmap()d。
在我的Ubuntu系统上,在调用pthread_join()
之前不会回收堆栈。我怀疑这只是实施的人工制品,而不是有意识的设计决定。