2011-10-03 88 views
5

我有一個程序啓動一個線程(使用pthreads),它將爲程序的其餘部分執行一些後臺任務。主程序在終端中運行,常見的用例是在使用Ctrl-C自行退出之前將其關閉。有人問我是不同的線程我成爲殭屍。我之前沒有想過這個問題,而且我一般都是多線程編程的新手。我創建了我希望的是一個小的,但完整的自包含測試程序,它應該模仿真實程序的行爲。這個線程可以成爲殭屍

在下面的代碼中,是否有產生線程成爲殭屍的風險?回想一下,使用Ctrl-C可以殺死該程序,也許這是一種特殊的情況,我不確定這一點。

現在,線程在MyThread對象被刪除後繼續運行。這不是一個真正的問題,因爲在真正的程序中,MyThread對象被銷燬,就像程序即將退出一樣。我只是想知道,在父母離開之後,這個線程永遠不會成爲系統中的殭屍。

我想我可以有一個互斥保護變量,我檢查線程func每次迭代告訴我,如果我應該退出,並且我可以在MyThread析構函數中將此變量設置爲true,但也許我不需要這樣做嗎? 對不起,有點長,感謝您的閱讀和提前感謝任何幫助!

#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

謝謝大家的幫助,快速而簡潔。我希望我盡我所能完成了我的計算器職責。 –

+1

如果父母不在,流程不會成爲殭屍。如果父母死亡,該進程立即由init(pid 1)繼承,並在完成時收回。一個進程只會在它的父代還活着時終止,而父進程不會收穫(通過wait()或waitpid())。 –

回答

3

線程不會成爲殭屍;流程做。當你殺死一個進程時,它會自動殺死它的所有線程。

簡而言之,你不需要做任何特殊的事情,只是因爲你有第二個線程在運行。

0

Ctrl+C -out程序默認會終止整個進程樹,包括任何子進程和線程。所以不用擔心,除非您爲SIGINT設置了一個自定義信號處理程序。