首頁  >  文章  >  後端開發  >  C++ 多執行緒程式設計中執行緒池的使用場景有哪些?

C++ 多執行緒程式設計中執行緒池的使用場景有哪些?

WBOY
WBOY原創
2024-06-04 19:51:08517瀏覽

線程池用於管理線程,透過維護預先分配的線程池來減少線程開銷。具體場景包括:減少執行緒建立和銷毀開銷;管理並發性,防止資源耗盡;提高程式碼簡潔性,消除執行緒管理細節。

C++ 多线程编程中线程池的使用场景有哪些?

C++ 多執行緒程式設計中執行緒池的使用場景

執行緒池是一種管理執行緒的機制,它可以提高多執行緒程式設計的效率和效能。在 C++ 中,可以透過使用 std::threadstd::condition_variable 等標準函式庫來實作執行緒池。

以下是一些使用執行緒池的常見場景:

  • 減少執行緒建立和銷毀的開銷:建立和銷毀執行緒是一個相對昂貴的操作。執行緒池透過維護一個預先分配的執行緒池來避免這個開銷。
  • 管理並發性:執行緒池可以限制同時執行的執行緒數量,這對於防止系統資源耗盡非常重要。
  • 提高程式碼簡潔性:執行緒池可以簡化多執行緒編程,因為它消除了管理執行緒本身的繁瑣細節。

實戰案例

以下是一個使用std::threadstd::condition_variable 在C++中實作執行緒池的範例:

#include <condition_variable>
#include <iostream>
#include <mutex>
#include <queue>
#include <thread>
#include <vector>

using namespace std;

// 线程池类
class ThreadPool {
public:
    ThreadPool(int num_threads) : stop(false) {
        // 创建指定数量的线程并将其添加到线程池
        for (int i = 0; i < num_threads; i++) {
            threads.emplace_back([this] {
                while (!stop) {
                    unique_lock<mutex> lock(mtx);
                    if (!tasks.empty()) {
                        // 从任务队列中获取任务
                        auto task = tasks.front();
                        tasks.pop();
                        // 执行任务
                        task();
                        // 通知条件变量任务已完成
                        cv.notify_one();
                    } else {
                        // 如果任务队列为空,则等待新任务
                        cv.wait(lock);
                    }
                }
            });
        }
    }

    ~ThreadPool() {
        // 停止所有线程
        stop = true;
        cv.notify_all();

        // 等待所有线程完成
        for (auto& thread : threads) {
            thread.join();
        }
    }

    // 向任务队列添加任务
    void enqueue(function<void()> &&task) {
        unique_lock<mutex> lock(mtx);
        tasks.push(move(task));
        // 通知条件变量有新任务
        cv.notify_one();
    }

private:
    bool stop;  // 线程池停止标志
    mutex mtx;  // 用于保护任务队列和条件变量
    condition_variable cv;  // 用于等待新任务
    queue<function<void()>> tasks;  // 任务队列
    vector<thread> threads;  // 线程池中的线程
};

int main() {
    // 创建具有 4 个线程的线程池
    ThreadPool pool(4);

    // 向线程池添加 10 个任务
    for (int i = 0; i < 10; i++) {
        pool.enqueue([i] {
            cout << "Task " << i << " executed by thread " << this_thread::get_id() << endl;
        });
    }

    return 0;
}

在這個範例中,我們建立了一個ThreadPool 類,它維護一個預先分配的執行緒池。任務透過 enqueue 函數加入到任務佇列中。執行緒池中的執行緒持續不斷地從任務佇列中取得任務並執行它們。當任務佇列為空時,執行緒會等待條件變數被通知,表示有新任務可用。

輸出如下:

Task 0 executed by thread 139670130218816
Task 1 executed by thread 139670129941952
Task 2 executed by thread 139670130082240
Task 3 executed by thread 139670130226176
Task 4 executed by thread 139670129949696
Task 5 executed by thread 139670130233920
Task 6 executed by thread 139670129957440
Task 7 executed by thread 139670130090080
Task 8 executed by thread 139670130241664
Task 9 executed by thread 139670129965184

以上是C++ 多執行緒程式設計中執行緒池的使用場景有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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