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

