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

C++循环中使用std::async实现无等待连续多线程执行的方法

解决std::async循环阻塞的问题

你遇到的问题核心在于std::future的析构行为:每次调用std::async(std::launch::async, ...)都会返回一个std::future对象,而这个对象在当前循环迭代结束时会被销毁——std::future的析构函数会自动等待关联的异步任务执行完成,这就导致了每次循环都要等上一个任务做完才会进入下一次迭代。

解决方案:保存所有std::future对象

我们只需要把每次std::async返回的std::future存储到一个容器中,避免它们被立即销毁,这样所有异步任务就能并行启动,不需要等待上一个完成。

修改后的代码如下:

#include<stdio.h> 
#include<thread> 
#include<iostream> 
#include <future>
#include <vector> // 新增容器头文件

using namespace std; 

void Compute(int i) {
    printf("i=%d\n",i);
    std::this_thread::sleep_for(std::chrono::seconds(1));
} 

int main() {
    // 创建一个vector存储所有future对象
    vector<std::future<void>> futures;
    futures.reserve(99999); // 预分配空间,提升性能

    for(int i=0;i<99999;++i) {
        // 将future存入容器,避免立即销毁
        futures.emplace_back(std::async(std::launch::async, Compute, i));
    }

    // 可选:等待所有任务完成(如果main需要等所有任务结束再退出)
    for(auto& fut : futures) {
        fut.get();
    }
}

重要提醒:线程数量限制

你要注意,创建99999个线程是非常不现实的——操作系统的线程资源是有限的,这么多线程会导致系统资源耗尽,甚至程序崩溃。如果你的实际业务需要处理大量异步任务,更合理的方案是使用线程池来复用线程,而不是每次都创建新线程。不过上面的代码已经解决了你当前“无需等待上一次迭代即可连续执行”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:29:08