C 11 中的執行緒池
挑戰:
建立和管理執行緒可能會很昂貴,執行緒可能會很昂貴,執行緒可能會很昂貴,尤其是在以下情況下對每個任務重複進行。我們如何建立一個執行緒池,允許我們將多個任務傳送到執行緒池,從而避免創建執行緒的開銷?
答案:
實作執行緒C 11 中的池涉及建立一個類別來管理可重用來執行任務的執行緒集合。以下是關鍵方面的細分:
實作 ThreadPool 類別:
ThreadPool 類別定義了用於建立、管理和停止執行緒池的介面。
1。 ThreadPool::Start:
透過建立指定數量的執行緒來初始化執行緒池。這些執行緒將執行無限循環,等待任務。
2. ThreadPool::ThreadLoop:
池中每個執行緒執行的無限迴圈。它不斷檢查新任務,執行它們,並重複直到發出終止信號。
3. ThreadPool::QueueJob:
將任務加入執行緒池佇列。任務是一個定義要完成的工作的函數物件。
4. ThreadPool::busy:
檢查執行緒池是否有任何待處理的任務。
5. ThreadPool::Stop:
終止執行緒池,等待所有執行緒完成目前任務。
整合 ThreadPool:
一旦ThreadPool類別已定義,您可以將其用作如下:
thread_pool->QueueJob([] { /* ... */ });
範例:
std::vector<std::thread> workers; int total = 4; int arr[4] = {0}; void each_thread_does(int i) { arr[i] += 2; } int main() { // ThreadPool Example ThreadPool thread_pool; thread_pool.Start(); for (int i = 0; i < 8; ++i) { for (int j = 0; j < 4; ++j) { thread_pool.QueueJob(std::bind(each_thread_does, j)); } } // Wait for the thread pool to complete while (thread_pool.busy()) {} thread_pool.Stop(); arr[4] = std::min_element(arr, arr + 4); return 0; }
此範例示範如何使用提供的類別建立執行緒池,並向池中提交多個任務,而無需使用需要重複建立和刪除執行緒。
以上是C 11 執行緒池如何改善任務管理並減少開銷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!