加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

如何用C++实现一个线程池

12/19 11:09
179
阅读需 5 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在 C++ 中实现一个简单的线程池可以通过使用标准库中的 std::threadstd::queue 来实现。以下是一个基本的线程池示例:

#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;
}

这段代码创建了一个简单的线程池类 ThreadPool,通过添加任务到任务队列并由工作线程线性地执行任务。请注意,这只是一个最基本的线程池示例,实际应用还需要考虑更多因素,如异常处理、任务优先级、资源管理等。

相关推荐

电子产业图谱