簡體   English   中英

如何正確銷毀 c++ 中的線程池

[英]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.

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