C++ 线程池实现:高效并发执行任务

以下是一个简单的 C++ 线程池实现,用于高效执行并发任务。

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

class ThreadPool {
public:
    ThreadPool(int numThreads = std::thread::hardware_concurrency()) {
        for (int i = 0; i < numThreads; ++i) {
            threads_.emplace_back([this] {
                while (true) {
                    std::function<void()> task;
                    {
                        std::unique_lock<std::mutex> lock{mutex_};
                        condition_.wait(lock, [this] { return !tasks_.empty() || stop_; });
                        if (stop_ && tasks_.empty()) {
                            return;
                        }
                        task = std::move(tasks_.front());
                        tasks_.pop();
                    }
                    task();
                }
            });
        }
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock{mutex_};
            stop_ = true;
        }
        condition_.notify_all();
        for (auto& thread : threads_) {
            thread.join();
        }
    }

    template<typename Func, typename... Args>
    void enqueue(Func&& func, Args&&... args) {
        auto task = std::make_shared<std::packaged_task<void()>>(std::bind(std::forward<Func>(func), std::forward<Args>(args)...));
        {
            std::unique_lock<std::mutex> lock{mutex_};
            tasks_.emplace([task] { (*task)(); });
        }
        condition_.notify_one();
    }

private:
    std::vector<std::thread> threads_;
    std::queue<std::function<void()>> tasks_;
    std::mutex mutex_;
    std::condition_variable condition_;
    bool stop_ = false;
};

// 测试代码
int main() {
    ThreadPool pool;
    for (int i = 0; i < 10; ++i) {
        pool.enqueue([](int num) {
            std::cout << 'Task ' << num << ' is running.' << std::endl;
        }, i);
    }
    return 0;
}

使用说明:

使用 ThreadPool 类可以创建一个指定数量的线程池,并将需要执行的任务提交到线程池中。在 enqueue 函数中,将任务包装为 std::function 类型,并将其保存到任务队列中。每个线程会不断地从任务队列中取出任务并执行,直到线程池被销毁。当线程池被销毁时,会向所有线程发送停止信号,并等待所有线程退出。

C++ 线程池实现:高效并发执行任务

原文地址: https://www.cveoy.top/t/topic/mwcQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录