为什么线程在终止时它们的堆栈仍然存在?不是超脱?

时间:2012-01-04 15:29:35

标签: c++ multithreading

当你使用线程,并且线程运行终止但没有分离时,它处于僵尸状态,等待通过连接获得或被分离,以便可以清除其资源。 / p>

我读到当线程是僵尸时未清理的两个'资源'是堆栈和返回值。

有人可以告诉我允许堆栈持续到加入之前的逻辑吗?如果返回值有一个单独的位置,我想不出一个很好的理由 - 但我确定有一个,我想知道它何时使用线程。

2 个答案:

答案 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()之前不会回收堆栈。我怀疑这只是实施的人工制品,而不是有意识的设计决定。