首頁 >後端開發 >C++ >C 11 中的執行緒池如何運作?

C 11 中的執行緒池如何運作?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-27 13:58:10220瀏覽

How Does Thread Pooling Work in C  11?

C 11 中的執行緒池

簡介

簡介

池的技術可以動態分配任務的執行緒集。與在每個任務上建立和銷毀執行緒相比,它具有多種優勢,包括提高效能和資源效率。

了解執行緒池

在 C 11 中,執行緒池通常是使用執行緒、互斥體和條件變數的組合來實現。線程在後台創建並啟動,任務被添加到隊列中。工作人員不斷監視佇列,等待新任務可用。一旦任務可用,worker 將檢索並執行它。

建立執行緒池

class ThreadPool {
public:
    void Start();
    void QueueJob(const std::function<void()>& job);
    void Stop();
    bool busy();

private:
    void ThreadLoop();

    bool should_terminate = false;
    std::mutex queue_mutex;
    std::condition_variable mutex_condition;
    std::vector<std::thread> threads;
    std::queue<std::function<void()>> jobs;
};
要建立執行緒池,我們可以定義一個 ThreadPool 類別:

管理主題Pool
  • Start:
  • 透過建立和啟動工作執行緒來啟動執行緒池。
  • QueueJob:
  • 新增執行緒任務到佇列中供工作人員執行執行。
  • 停止:
  • 透過為工作執行緒設定終止標誌並等待它們完成來停止執行緒池。
  • 忙:
檢查如果線程池正忙(即,有任務在

工作線程循環

void ThreadPool::ThreadLoop() {
    while (true) {
        std::function<void()> job;
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            mutex_condition.wait(lock, [this] {
                return !jobs.empty() || should_terminate;
            });
            if (should_terminate) {
                return;
            }
            job = jobs.front();
            jobs.pop();
        }
        job();
    }
}
每個工作執行緒執行一個無限迴圈來等待和執行任務:

使用執行緒池

ThreadPool thread_pool;
thread_pool.Start();
thread_pool.QueueJob([] { /* ... */ });
使用執行緒執行緒池,只需建立一個實例並呼叫 QueueJob來新增任務:

線程池的優點
  • 提高效能:透過重複使用線程,我們消除了每個任務建立和銷毀線程的開銷。 >資源效率:任務中的執行緒數量可以根據工作負載調整池,節省資源。 >

以上是C 11 中的執行緒池如何運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn