我最近在uni項目上工作,我需要管理一對線程池。 池中的工作線程所做的基本上是對每個相應的隊列執行某種類型的彈出操作,如果隊列中沒有可用的值,最終等待條件變量(pthread_cond_t
),並且一旦它們獲得一個項目,就解析它並相應地執行操作。 我關心的是,我想沒有內存泄漏,並實現我注意到,在主進程退出時在每個線程上調用pthread_cancel
肯定是一個壞主意,因爲它留下了很多垃圾周圍。 關鍵是,我的第一個想法是使用退出標誌,我可以設置線程需要退出時,以便他們可以輕鬆地釋放內存並調用pthread_exit
...我想我應該設置此標誌,然後發送向等待條件變量的線程發送廣播信號,並在彈出操作後立即檢查標誌...什麼是阻止線程池運行的好方法?
這是否真的是實現良好線程池終止的正確方法?我不覺得這個是多信心...... 我在這裏寫一些僞代碼來解釋我談論
每個池中的線程將運行一些代碼的結構是這樣的:
/* Worker thread (which will run on each pool thread) */
{ /* Thread initialization */ ... }
loop {
value = pop();
{ /* Mutex lock because of the shared flag */ ... }
if (flag) {{ /* Free memory and unlock mutex */ ... } pthread_exit(); }
{ /* Unlock the mutex */ ... }
{ /* Elaborate value */ ... }
}
return NULL;
而且會有某種pool_stopRunning()
功能,這將是這樣的:提前
/* pool_stopRunning() function code */
{ /* Acquire flag mutex */ ... }
setFlag(flag);
{ /* Unlock flag mutex */ ... }
{ /* Acquire queue mutex */ ... }
pthread_cond_broadcast(...);
{ /* Unlock queue mutex */ ... }
謝謝,我只是需要確保有沒有看中-ER辦法阻止一個線程池。 ..(或者有機會認識更好的方法) 一如既往,對不起,如果有任何錯字,我不是和英文揚聲器,它現在是一種晚了>:
有必要使用互斥鎖來保護國旗。但儘量減少互斥鎖的時間。例如,在線程中,複製標誌值並釋放互斥鎖,然後在複製標誌值如此說明的情況下退出。不管你做什麼,乾淨的線程終止都需要主線程和其他線程之間的協作,如果涉及到任何共享狀態的話。 – Peter
我可能會研究這個https://github.com/Pithikos/C-Thread-Pool/blob/master/thpool.c,查看destroy函數內部,以瞭解這個lib如何實現它。 – n3wb
首先,你需要這樣做嗎?如果您只是在進程終止時刪除池,那麼在Linux/Windows等主流多任務操作系統上,您不需要發出信號/停止/終止任何事情,除非有迫切需要。在停止線程方面,操作系統要比用戶代碼好得多,(用戶代碼無法停止在請求停止的線程在另一個內核上運行的線程)。我懷疑過早的停止優化... – ThingyWotsit