2011-10-03 30 views
5

Tôi có một chương trình bắt đầu một chuỗi (sử dụng pthreads) sẽ thực hiện một số tác vụ nền cho phần còn lại của chương trình. Chương trình chính được chạy trong một thiết bị đầu cuối và một trường hợp sử dụng phổ biến là đóng nó trước khi nó tự thoát ra bằng cách sử dụng Ctrl-C. Có người đã yêu cầu tôi thay đổi chủ đề tôi sinh ra để trở thành zombie. Tôi đã không nghĩ về vấn đề này trước đây và tôi là một người mới trong lập trình đa luồng nói chung. Tôi tạo ra những gì tôi hy vọng là một chương trình thử nghiệm nhỏ, nhưng hoàn chỉnh, và khép kín mà nên bắt chước hành vi của chương trình thực sự.Chủ đề này có thể trở thành một zombie

Trong đoạn mã dưới đây, có nguy cơ phát sinh sợi tơ để trở thành zombie không? Nhớ lại rằng chương trình có thể bị giết bằng cách sử dụng Ctrl-C, có lẽ đó là một kịch bản đặc biệt, tôi không chắc chắn về điều đó.

Ngay bây giờ, chuỗi tiếp tục chạy sau khi đối tượng MyThread đã bị xóa. Đây không thực sự là một vấn đề, bởi vì trong chương trình thực sự, đối tượng MyThread bị phá hủy ngay khi chương trình sắp thoát ra. Tôi chỉ muốn biết rằng các chủ đề không bao giờ có nguy cơ trở thành một zombie trong hệ thống sau khi cha mẹ đã biến mất.

Tôi cho rằng tôi có thể có biến được bảo vệ bằng mutex mà tôi kiểm tra trong chuỗi func mỗi lần lặp lại để cho tôi biết nếu tôi nên thoát và tôi có thể đặt biến này thành true trong trình hủy MyThread, nhưng có lẽ tôi không cần phải làm điều đó? Xin lỗi, đã có một chút thời gian, cảm ơn bạn đã đọc và cảm ơn trước vì đã giúp đỡ!

#include <iostream> 
#include <pthread.h> 
#include <unistd.h> 

class MyThread 
{ 
public: 
    MyThread() : is_running(false) {} 

    void Run() 
    { 
     if (!is_running) { 
     if (pthread_create(&thread, NULL, 
          (void * (*)(void *))RunThread, 
          NULL) == 0) { 
      is_running = true; 
     } 
     else { 
      std::cerr << "pthread_create() failed." << std::endl; 
     } 
     } 
     else { 
     std::cout << "The thread was already running." << std::endl; 
     } 
    } 
private: 
    static void * RunThread(void */*arg*/) 
    { 
     while (true) { 
     sleep(1); 
     std::cout << "Hello from RunThread" << std::endl; 
     } 
     return NULL; 
    } 

    pthread_t thread; 
    bool is_running; 
}; 

int main() 
{ 
    MyThread *thread = new MyThread; 

    thread->Run(); 

    std::cout << "Going to sleep for five seconds." << std::endl; 
    sleep(5); 
    std::cout << "No longer asleep, deleting thread object." << std::endl; 

    delete thread; 

    std::cout << "Hit enter to exit program." << std::endl; 
    std::cin.get(); 

    return 0; 
} 
+0

http://stackoverflow.com/questions/7285109/unix-zombies-and-daemons/7285149#7285149 –

+0

Cảm ơn tất cả vì sự giúp đỡ của bạn, nhanh chóng và ngắn gọn. Tôi hy vọng tôi đã làm nhiệm vụ stackoverflow của tôi như tôi cần. –

+1

Quá trình không trở thành một zombie nếu cha mẹ của nó đã biến mất. Nếu cha mẹ chết, quá trình này ngay lập tức được kế thừa bởi init (pid 1) và sẽ được gặt hái khi nó hoàn thành. Một quá trình chỉ trở thành một zombie nếu nó kết thúc khi cha mẹ của nó vẫn còn sống, và cha mẹ không gặt hái nó (thông qua wait() hoặc waitpid()). –

Trả lời

3

Chủ đề không trở thành zombie; quy trình làm. Khi bạn giết một quá trình, điều này sẽ tự động giết chết tất cả các chủ đề của nó.

Tóm lại, bạn không cần phải làm bất cứ điều gì đặc biệt chỉ vì bạn có chuỗi thứ hai đang chạy.

0

Ctrl+C -chọn một chương trình theo mặc định sẽ diệt toàn bộ cây quá trình, bao gồm bất kỳ tiến trình và chuỗi con nào. Vì vậy, không phải lo lắng trừ khi bạn thiết lập trình xử lý tín hiệu tùy chỉnh cho SIGINT.

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