2014-11-18 36 views
7

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:

  1. Tạo một quá trình với một thread chính
  2. Tạo một sợi tách ra mới
  3. pthread_exit thread chính
  4. pthread_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 
+1

có thể bạn muốn 'ptherad_join() '? –

+0

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

+0

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

Trả lời

4

Đây là sự cố đã biết. A fix proposed cách đây không lâu bởi Kaz không được Ulrich Drepper chấp nhận. bình luận của ông về vấn đề này là:

I haven't looked at the patch nor tried it. 

If the patch changes the behavior that the main thread, after calling 
sys_exit, still react to signals sent to this thread or to the process 
as a whole, then the patch is wrong. The userlevel context of the 
thread is not usable anymore. It will have run all kinds of 
destructors. The current behavior is AFAIK that the main thread won't 
react to any signal anymore. That is absolutely required. 

Đọc chuỗi email để thảo luận thêm về điều này ở đây:

http://lkml.iu.edu/hypermail/linux/kernel/0902.0/00153.html

3

Các hệ điều hành cho rằng quá trình của bạn là một zombie vì các chủ đề chính, được bắt đầu bởi các hệ điều hành, trả lại (ví dụ: thoát). Nếu bạn không muốn hành vi này, thì không có lối thoát chủ đề chính.

+1

Tôi muốn thêm rằng đây là một zombie danh nghĩa (một "nombie"?). Việc chấm dứt luồng chính thông qua 'pthread_exit' khi các luồng khác đang chạy không _not_ tạo ra một SIGCHLD, cũng không làm gián đoạn bất kỳ cuộc gọi giống như' chờ đợi' nào trong phần tử cha. Quá trình này là "không còn tồn tại" nhiều hơn hoặc ít hơn chỉ từ quan điểm của _ps (1) _. – pilcrow

+1

Vâng, tất cả các chủ đề được bắt đầu bởi hệ điều hành theo nghĩa đó. 'pthread_exit()', theo định nghĩa, chỉ nên thoát khỏi luồng hiện tại, giống như khi nó được gọi từ bất kỳ luồng nào khác. Vì vậy, nó hoàn toàn hợp lý để mong đợi thread chính để cư xử theo cách như bất kỳ thread khác trong quá trình này. Nhưng tất nhiên, nó không. –

+0

Rõ ràng, chủ đề chính * không phải * giống như bất kỳ chủ đề nào khác: nó * không * phải được tạo bởi 'pthread_create()' và hệ điều hành được phép xử lý kết thúc của nó là đặc biệt. –

Các vấn đề liên quan