![](/img/trans.png)
[英]Multithread server in C++, how to terminate threads and clean up nicely
[英]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.