我已經使用pthread創建了一個線程。我的工作程序是一個無限循環。當我的主程序退出時終止並清理pthread的所有資源的設計模式是什麼?當程序終止時清理pthread資源
pthread_create(&thread, NULL, worker, NULL);
void* worker(void* arg){
while(true){
//do something
}
}
感謝
我已經使用pthread創建了一個線程。我的工作程序是一個無限循環。當我的主程序退出時終止並清理pthread的所有資源的設計模式是什麼?當程序終止時清理pthread資源
pthread_create(&thread, NULL, worker, NULL);
void* worker(void* arg){
while(true){
//do something
}
}
感謝
的所有線程應該由他們自己來退出,或者你將不得不進行人工清洗。在第一種方法中,您將不得不使用一些全局變量,這些變量將使用鎖定來保證線程停止執行。像這樣的東西將在每個線程的while(true)循環中。
而(真)
{
GETLOCK(SomeGlobalVariable);
if(SomeGlobalVariable == true)
{
unlock(SomeGlobalVariable);
break;
}
unlock(SomeGlobalVariable);
}
在第二種方法中,您將不得不跟蹤您在數組中創建的所有線程標識,然後在退出時逐個終止所有這些標識。
如果你的程序要使用很多線程,那麼你最好去線程池。在線程池中,您可以在程序開始時創建一些線程,然後在需要時給予線程,並在工作完成時返回線程資源。
有這樣的圖書館。例如http://threadpool.sourceforge.net/
我通常有一個全局變量,它被初始化爲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()
。我認爲線程應該在被告知的五秒內退出。
我不是有史以來從外面殺死線程。可以引入的問題太多了。全局標誌方法允許每個線程自己控制自己,因爲它通常是唯一知道何時可以安全地退出乾淨的方法。
除了檢查交換機,全局或其他,pthreads有它自己的取消機制。看看pthread_cancel(),pthread_setcancelstate(),pthread_setcanceltype(),pthread_testcancel(),pthread_cleanup_push()等
的基本思路是工作線程創建(或使用現有)取消點。如果取消,則在退出之前調用線程的推送清理處理程序以清理資源。
當你的主程序退出時,所有線程都退出。這意味着只有一個線程調用exit()(或者如果主例程終止),則其他線程將退出。
你不能殺了線程。如果你殺了它正在做的工作,那麼線程充其量你得到了內存泄漏,在最壞的情況你會得到一個僵局。無論哪種方式,它都不漂亮。
被清理的過程中終止任何資源,將被清理,當最後一個線程退出(或如果任何線程調用exit())。這包括存儲器(不包括共享存儲器,例如POSIX或SYSV),類文件對象(如果沒有其他過程具有他們的打開描述符)和一些其他類型的對象。
還有什麼是持久的(如臨時文件,某些類型的共享內存),你需要清理自己,之前退出或(更有力)在下次運行的開始。