2010-10-20 27 views
0

我已經使用pthread創建了一個線程。我的工作程序是一個無限循環。當我的主程序退出時終止並清理pthread的所有資源的設計模式是什麼?當程序終止時清理pthread資源

pthread_create(&thread, NULL, worker, NULL); 

void* worker(void* arg){ 

while(true){ 

//do something 
} 

} 

感謝

回答

0

的所有線程應該由他們自己來退出,或者你將不得不進行人工清洗。在第一種方法中,您將不得不使用一些全局變量,這些變量將使用鎖定來保證線程停止執行。像這樣的東西將在每個線程的while(true)循環中。

而(真)
{
GETLOCK(SomeGlobalVariable);
if(SomeGlobalVariable == true)
{
unlock(SomeGlobalVariable);
break;
}
unlock(SomeGlobalVariable);
}

在第二種方法中,您將不得不跟蹤您在數組中創建的所有線程標識,然後在退出時逐個終止所有這些標識。

如果你的程序要使用很多線程,那麼你最好去線程池。在線程池中,您可以在程序開始時創建一些線程,然後在需要時給予線程,並在工作完成時返回線程資源。

有這樣的圖書館。例如http://threadpool.sourceforge.net/

0

我通常有一個全局變量,它被初始化爲true,並且當你希望線程退出並加入到主函數中的線程時,它被設置爲false。下面的僞代碼:

global isRunning = true 

def main: 
    isRunning = true 
    id1 = startThread (worker) 
    id2 = startThread (worker) 
    id3 = startThread (worker) 
    joinThread (id1) 
    joinThread (id2) 
    joinThread (id3) 
    exit 

def worker: 
    initialiseWorker() 
    while isRunning: 
      # something in here (or a signal handler) will 
      # set isRunning to false. 
      doSomeWork() 
    terminateWorker() 

,並確保線程做循環及時,這樣,當他們應該退出,他們可以檢測。如果他們長時間運行的工作,您還需要定期檢查doSomeWork()。我認爲線程應該在被告知的五秒內退出。

我不是有史以來從外面殺死線程。可以引入的問題太多了。全局標誌方法允許每個線程自己控制自己,因爲它通常是唯一知道何時可以安全地退出乾淨的方法。

0

當你的主程序退出時,所有線程都退出。這意味着只有一個線程調用exit()(或者如果主例程終止),則其他線程將退出。

你不能殺了線程。如果你殺了它正在做的工作,那麼線程充其量你得到了內存泄漏,在最壞的情況你會得到一個僵局。無論哪種方式,它都不漂亮。

被清理的過程中終止任何資源,將被清理,當最後一個線程退出(或如果任何線程調用exit())。這包括存儲器(不包括共享存儲器,例如POSIX或SYSV),類文件對象(如果沒有其他過程具有他們的打開描述符)和一些其他類型的對象。

還有什麼是持久的(如臨時文件,某些類型的共享內存),你需要清理自己,之前退出或(更有力)在下次運行的開始。