You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++线程池任务添加函数(add/enqueue)相关技术咨询

C++线程池任务添加函数(enqueue)详解

咱们先来聊聊C++线程池里的任务添加逻辑——你提到的两个实现中的add和enqueue函数其实高度相似,我把第二个项目里的enqueue代码片段(结合这类实现的典型补全内容)整理出来,咱们一起拆解下核心逻辑:

auto ThreadPool::enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> {
    using return_type = typename std::result_of<F(Args...)>::type;
    // 包装任务并绑定参数,完美转发避免不必要拷贝
    auto task = std::make_shared<std::packaged_task<return_type()>>(
        std::bind(std::forward<F>(f), std::forward<Args>(args)...)
    );

    std::future<return_type> res = task->get_future();
    {
        // 加锁保证任务入队的线程安全
        std::unique_lock<std::mutex> lock(queue_mutex);
        // 线程池已停止时拒绝新任务
        if(stop)
            throw std::runtime_error("enqueue on stopped ThreadPool");
        // 将包装后的任务推入队列
        tasks.emplace([task](){ (*task)(); });
    }
    // 唤醒一个空闲线程执行新任务
    condition.notify_one();
    return res;
}

咱们来拆解几个关键细节:

  • 返回值与类型推导:用std::result_of<F(Args...)>::type自动推导任务函数的返回类型,再通过std::future把任务的执行结果暴露给调用者,方便后续异步获取结果。
  • 完美转发与任务包装:用std::forward对传入的函数和参数做完美转发,最大程度减少拷贝开销;同时用std::packaged_task把任务包装起来,绑定到std::future上,实现异步结果的传递。
  • 线程安全保障:通过std::unique_lock加锁保护任务队列,避免多线程并发添加任务时的竞态问题;入队完成后用条件变量唤醒空闲线程,让新任务能被及时处理。
  • 边界状态处理:如果线程池已经处于停止状态,会直接抛出异常拒绝新任务,避免无效操作导致的问题。

内容的提问来源于stack exchange,提问作者amigo421

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:24:08