亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Linux C++中實現線程池的優雅擴容與縮容

發布時間:2024-11-18 09:29:18 來源:億速云 閱讀:79 作者:小樊 欄目:編程語言

在 Linux 中,使用 C++ 實現線程池的優雅擴容與縮容可以通過以下幾個步驟來完成:

  1. 定義線程池類 首先,我們需要定義一個線程池類,該類包含以下成員變量:
  • 工作線程的數量
  • 任務隊列
  • 互斥鎖
  • 條件變量
  • 工作線程函數
#include <iostream>
#include <vector>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>

class ThreadPool {
public:
    ThreadPool(size_t num_threads);
    ~ThreadPool();

    template<class F, class... Args>
    void enqueue(F&& f, Args&&... args);

private:
    size_t num_threads_;
    std::vector<std::thread> threads_;
    std::queue<std::function<void()>> tasks_;
    std::mutex mutex_;
    std::condition_variable cond_;

    void worker_thread();
};
  1. 實現線程池構造函數和析構函數 在構造函數中,我們創建指定數量的工作線程。在析構函數中,我們等待所有工作線程完成并關閉它們。
ThreadPool::ThreadPool(size_t num_threads) : num_threads_(num_threads) {
    for (size_t i = 0; i < num_threads_; ++i) {
        threads_.emplace_back(&ThreadPool::worker_thread, this);
    }
}

ThreadPool::~ThreadPool() {
    {
        std::unique_lock<std::mutex> lock(mutex_);
        stop_ = true;
    }
    cond_.notify_all();
    for (auto& thread : threads_) {
        if (thread.joinable()) {
            thread.join();
        }
    }
}
  1. 實現任務入隊函數 enqueue 函數用于將任務添加到任務隊列中。
template<class F, class... Args>
void ThreadPool::enqueue(F&& f, Args&&... args) {
    {
        std::unique_lock<std::mutex> lock(mutex_);
        tasks_.emplace([f, args...] { f(args...); });
    }
    cond_.notify_one();
}
  1. 實現工作線程函數 worker_thread 函數是每個工作線程執行的函數。它從任務隊列中獲取任務并執行。
void ThreadPool::worker_thread() {
    while (true) {
        std::function<void()> task;
        {
            std::unique_lock<std::mutex> lock(mutex_);
            cond_.wait(lock, [this] { return !tasks_.empty() || stop_; });
            if (stop_ && tasks_.empty()) {
                break;
            }
            task = std::move(tasks_.front());
            tasks_.pop();
        }
        task();
    }
}
  1. 實現優雅擴容與縮容 為了實現優雅擴容與縮容,我們可以在運行時根據需要增加或減少工作線程的數量。以下是一個簡單的示例:
void ThreadPool::resize(size_t new_num_threads) {
    if (new_num_threads == num_threads_) {
        return;
    }

    // 停止舊的工作線程
    {
        std::unique_lock<std::mutex> lock(mutex_);
        stop_ = true;
    }
    cond_.notify_all();
    for (auto& thread : threads_) {
        if (thread.joinable()) {
            thread.join();
        }
    }

    // 更新工作線程數量
    num_threads_ = new_num_threads;

    // 啟動新的工作線程
    for (size_t i = 0; i < new_num_threads; ++i) {
        threads_.emplace_back(&ThreadPool::worker_thread, this);
    }
}

現在,你可以使用 resize 函數來優雅地擴展或縮小線程池的大小。請注意,這只是一個簡單的示例,實際應用中可能需要考慮更多的因素,例如線程池的初始化、銷毀和同步等。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

古丈县| 乡城县| 沾化县| 定兴县| 丹巴县| 汽车| 郓城县| 若羌县| 冀州市| 会同县| 合水县| 文化| 晋中市| 宜丰县| 十堰市| 邵阳县| 黔西县| 清镇市| 弋阳县| 大余县| 嵊州市| 土默特右旗| 同江市| 台北市| 玉溪市| 分宜县| 吉木乃县| 北碚区| 武汉市| 司法| 和田县| 金溪县| 同仁县| 金华市| 新宾| 岱山县| 云南省| 宁河县| 曲阜市| 惠安县| 全南县|