【发布时间】:2015-01-15 18:03:53
【问题描述】:
为什么Linux认为主线程已经终止的进程是僵尸进程,有什么办法可以避免这种情况?
在下面的代码中:
- 创建一个只有一个主线程的进程
- 创建一个新的分离线程
-
pthread_exit主线程 -
pthread_exit分离的线程
在#3 之前,ps(1) 将我的进程显示为正常进程。然而,在 #3 之后,ps(1) 将我的进程显示为僵尸(例如,2491 pts/0 00:00:00 thread-app <defunct>)即使它仍然有正在运行的线程。
是否可以退出主线程但避免进入僵尸状态?
代码:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
void *thread_function(void *args)
{
printf("The is new thread! Sleep 20 seconds...\n");
sleep(20);
printf("Exit from thread\n");
pthread_exit(0);
}
int main(int argc, char **argv)
{
pthread_t thrd;
pthread_attr_t attr;
int res = 0;
res = pthread_attr_init(&attr);
res = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
res = pthread_create(&thrd, &attr, thread_function, NULL);
res = pthread_attr_destroy(&attr);
printf("Main thread. Sleep 5 seconds\n");
sleep(5);
printf("Exit from main process\n");
pthread_exit(0);
}
# ./thread-app
【问题讨论】:
-
也许你想要
ptherad_join()? -
我想要一个新线程,它比原来的主线程寿命更长。并且该主线程被正确销毁,没有成为僵尸。
-
@likern,我对您的帖子进行了大量编辑,但我认为它更好地反映了您的问题。如果您不同意,则回滚编辑。
-
我认为原因是主线程和新线程共享内存,主线程拥有的数据可以被新线程使用 - 因此即使在主线程完成工作后也无法释放。由于这个原因,主线程被设置为僵尸状态。
-
@likern,根据 posix 标准,您是正确的。我认为 Linux 正在使用父线程来跟踪所有 pthread 信息。 pthread_exit 知道并保留该进程,而不是对其调用等待。在 linux 中,可能无法按照您的要求进行操作。我的一般编码策略是让主线程保持活动状态,直到所有子线程都消失,以避免出现未定义状态,所以直到你提出来我才看到。
标签: c linux multithreading pthreads posix