[英]how to properly destory a thread pool in c++
所以我正在使用一個變量
std::vector<pthread_t> preallocatedThreadsPool;
保存所有 pthreads,然后我使用 for 循環
preallocatedThreadsPool.resize(preallocatThreadsNumber); // create a threadpoOl
for(pthread_t i : preallocatedThreadsPool) {
pthread_create(&i, NULL, threadFunctionUsedByThreadsPool, NULL);
}
創建線程池,
問題是我如何真正銷毀它,例如,當我向程序發送信號時,我需要手動處理程序以停止所有預分配的 pthreads?
我嘗試使用另一個 for 循環並在 for 循環內調用pthread_exit(i)
,但是 IDE 告訴我 for 循環只會執行一次,這顯然不起作用
我嘗試使用 preallocatedThreadsPool.clear() 來清理向量,但是當我使用 gdb 工具對其進行調試時,在信息線程中,線程仍然存在嗎?
就我而言,有沒有一種好方法可以銷毀所有預分配的 pthreads?
線程必須自行退出。 你不能退出另一個線程。
您可以使用pthread_join
等待線程退出,或使用pthread_detach
表示您永遠不會調用pthread_join
。 您必須調用其中之一,否則它會泄漏線程。 pthread_join
銷毀線程; pthread_detach
不會銷毀線程(顯然),但它允許線程在退出時銷毀自身。
由於這是一個線程池,您必須有一個隊列,其中包含您希望池中的線程執行的操作。 您可以將特殊的“請退出”項目添加到隊列的末尾(或開頭),然后等待線程退出。 使線程在看到隊列中的“請退出”項目時退出。
這都是關於線程同步的。 正確的方法是您必須有一個全局標志(例如條件變量或 Win32 事件),線程必須定期檢查該標志,如果設置,則終止。 當一個線程退出時,您還必須等待它退出,因此每個線程都應該在“我完成了”時發出另一個事件信號。
之后,可以銷毀分配給 pthread 或 std::thread 或 CreateThread 的任何“句柄”。 在 std::thread 中,您可以分離並忘記句柄。
即使你可以通過 function 立即終止線程,例如 TerminateThread(pthreads 中應該有類似的東西),這也很糟糕,因為你可能已經泄漏了 memory。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.