簡體   English   中英

程序終止時清理pthread資源

[英]Clean up pthread resources when programme terminate

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

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

void* worker(void* arg){

while(true){

 //do something
}

}

謝謝

所有線程應自行退出,否則必須手動清理它們。 在第一種方法中,您將必須使用一些全局變量,這些變量將使用鎖加以保護,以告知線程停止執行。 這樣的事情將在每個線程的while(true)循環內。

while(true)  
{  
  GetLock(SomeGlobalVariable);  
  if(SomeGlobalVariable == true)  
   {  
    unlock(SomeGlobalVariable);   
    break;  
   }  
unlock(SomeGlobalVariable);   
} 

在第二種方法中,您必須跟蹤在數組中創建的所有threadId,然后在退出時一一殺死所有這些ID。

如果您的程序要使用多個線程,那么最好使用線程池。 在線程池中,您可以在程序的開頭創建一些線程,然后在需要時提供線程,並在工作完成時返回線程資源。

有用於此的庫。 例如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),類似文件的對象(如果沒有其他進程為其提供打開描述符)和某些其他類型的對象。

永久存在的任何其他內容(例如臨時文件,某些類型的共享內存),都需要在退出之前或(在更強健的情況下)在下一次運行開始時進行清理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM