【发布时间】:2012-08-07 22:38:53
【问题描述】:
我知道所有守护线程都是分离线程,但为什么所有分离线程都不是守护线程?
假设线程“main”创建线程“A”(非分离),线程“A”创建线程“B”(分离)。线程“A”能否在“B”继续运行时退出?
PS:我问的是pthreads,但无论如何请回答。
【问题讨论】:
标签: multithreading pthreads daemon detach
我知道所有守护线程都是分离线程,但为什么所有分离线程都不是守护线程?
假设线程“main”创建线程“A”(非分离),线程“A”创建线程“B”(分离)。线程“A”能否在“B”继续运行时退出?
PS:我问的是pthreads,但无论如何请回答。
【问题讨论】:
标签: multithreading pthreads daemon detach
也许你应该先阅读What is the difference between fork and thread?
详细说明
守护线程
通常在 C/C++(Linux 环境)中,人们会使用 fork() 创建一个守护进程。 fork() 通过复制调用进程来创建一个新进程。在这里,父进程将退出,而将子进程留在后面。该子进程从控制终端分离,重新打开所有 {stdin, stdout, stderr} 到 /dev/null,并将工作目录更改为根目录。 (当然,基于标志)。在 Linux 下,fork() 是使用写时复制页实现的,因此它所招致的唯一损失是复制父页表以及为子页创建独特的任务结构所需的时间和内存。
线程分离
而Pthread的分离行为不同(1)被分离的线程一旦分离就不能再加入回来(2)分离属性仅仅决定了线程终止时系统的行为;如果进程使用 exit 终止(或等效地,如果主线程返回),它不会阻止线程终止。 pthread_detach() 函数将thread 标识的线程标记为已分离。当一个分离的线程终止时,它的资源会自动释放回系统,而不需要另一个线程加入到终止的线程中。
【讨论】:
我认为就内存模型而言,线程 A 可以退出而线程 B 可以继续运行。此外,如果没有用户线程正在执行,程序将退出......或者您可以认为只保留守护线程,因此应用程序将以不同的方式结束
【讨论】: