Tại sao Linux xem xét một quy trình mà chủ đề chính đã chấm dứt là một quá trình zombie và có cách nào để tránh điều này không?Quá trình Zombie mặc dù các chủ đề vẫn đang chạy
Trong đoạn mã dưới đây I:
- Tạo một quá trình với một thread chính
- Tạo một sợi tách ra mới
pthread_exit
thread chínhpthread_exit
thread tách
TrướC# 3, ps(1)
cho biết quy trình của tôi là chuyên gia bình thường cess. Tuy nhiên, sau # 3, ps(1)
cho thấy quy trình của tôi là một zombie (ví dụ: 2491 pts/0 00:00:00 thread-app <defunct>
) mặc dù nó vẫn có các chuỗi đang chạy.
Có thể thoát chủ đề chính nhưng tránh đi vào trạng thái zombie không?
Code:
#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
có thể bạn muốn 'ptherad_join() '? –
Tôi muốn chuỗi mới, chuỗi này sẽ tồn tại lâu hơn chuỗi chính gốc. Và chủ đề chính đó bị phá hủy một cách chính xác, mà không cần phải thây ma. – likern
vì vậy bạn muốn tách chủ đề khỏi chuỗi trung bình bằng cách sử dụng http://linux.die.net/man/3/pthread_detach :) – MimiEAM