加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關推薦
  • 電子產業(yè)圖譜
申請入駐 產業(yè)圖譜

如何用C++實現(xiàn)一個線程池

12/19 11:09
178
閱讀需 5 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

在 C++ 中實現(xiàn)一個簡單的線程池可以通過使用標準庫中的 std::threadstd::queue 來實現(xiàn)。以下是一個基本的線程池示例:

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

class ThreadPool {
public:
    ThreadPool(size_t numThreads) : stop(false) {
        for (size_t i = 0; i < numThreads; ++i) {
            threads.emplace_back([this] {
                while (true) {
                    std::function<void()> task;
                    {
                        std::unique_lock<std::mutex> lock(queueMutex);
                        condition.wait(lock, [this] { return stop || !tasks.empty(); });
                        if (stop && tasks.empty()) return;
                        task = std::move(tasks.front());
                        tasks.pop();
                    }
                    task();
                }
            });
        }
    }

    template<class F>
    void addTask(F&& task) {
        {
            std::unique_lock<std::mutex> lock(queueMutex);
            tasks.emplace(std::forward<F>(task));
        }
        condition.notify_one();
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(queueMutex);
            stop = true;
        }
        condition.notify_all();
        for (std::thread &worker : threads) worker.join();
    }
    
private:
    std::vector<std::thread> threads;
    std::queue<std::function<void()>> tasks;
    std::mutex queueMutex;
    std::condition_variable condition;
    bool stop;
};

// 示例用法
int main() {
    ThreadPool pool(4);

    for (int i = 0; i < 8; ++i) {
        pool.addTask([i] {
            std::cout << "Task " << i << " is runningn";
            std::this_thread::sleep_for(std::chrono::seconds(1));
        });
    }

    // 注意:主線程不能提前結束,否則線程池中的任務可能無法完成
    // 可以在這里等待所有任務完成后再退出
    std::this_thread::sleep_for(std::chrono::seconds(5));

    return 0;
}

這段代碼創(chuàng)建了一個簡單的線程池類 ThreadPool,通過添加任務到任務隊列并由工作線程線性地執(zhí)行任務。請注意,這只是一個最基本的線程池示例,實際應用還需要考慮更多因素,如異常處理、任務優(yōu)先級、資源管理等。

相關推薦

電子產業(yè)圖譜