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

C++使用std::async调用其他类成员函数失败问题求助

存在的错误点

    1. 成员函数调用参数类型错误
      调用非静态成员函数时,std::async要求传入的实例参数类型必须和成员函数所属类的指针/引用匹配,你传入的是&workset,实际是Work**二级指针,和Work::doWork要求的Work*实例类型不匹配,直接改传workset即可。
    1. main函数未执行实际逻辑
      你的main函数是空实现,没有创建Worker实例、调用Work_MP方法,自然不会有任何运行输出。
    1. 存在内存泄漏+悬垂指针风险
      循环内每次new Work()创建的对象没有对应的delete释放,会造成内存泄漏;同时如果直接传栈上临时对象的指针,异步任务执行前临时对象就会被销毁,会触发悬垂指针崩溃。
    1. 多线程输出无同步
      多个异步线程同时向std::cout写数据没有加锁,会导致输出内容乱序、甚至出现字符穿插的异常情况。
    1. future等待逻辑不明确
      v_async是Work_MP内的局部变量,函数退出前会析构所有存储的std::future,std::launch::async策略的异步任务对应的future析构时会阻塞等待任务完成,隐式阻塞的行为不符合开发惯例,建议显式调用get()等待任务完成。

修复后的参考代码

#include <iostream>
#include <thread>
#include <future>
#include <vector>
#include <mutex>

// 全局锁用于同步cout输出
std::mutex cout_mtx;

class Work
{
public:
    void doWork(int A);
};

void Work::doWork(int A)
{
    std::lock_guard<std::mutex> lock(cout_mtx);
    std::cout << "I got " << A << std::endl;    
}   

class Worker
{
public:
    void Work_MP();
};

void Worker::Work_MP()
{
    std::vector<std::future<void>> v_async;
    v_async.reserve(8);
    for (size_t i = 0; i < 8; i++)
    {   
        // 直接传临时Work对象,std::async内部会拷贝存储实例,避免内存问题
        v_async.emplace_back(std::async(std::launch::async, &Work::doWork, Work{}, i));
    }
    // 显式等待所有异步任务执行完成
    for (auto& fut : v_async) {
        fut.get();
    }
}

int main ()
{
    Worker worker;
    worker.Work_MP();
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 21:33:01