我需要内部循环来存储文件(每30秒进行序列化),并且对象很大,因此我只想在不等待结果的情况下触发异步任务而无需等待新线程,但问题是循环和结束打破。如何触发内部循环线程/异步任务?

 void Person::asyncSaveCrowd(boost::shared_ptr<Crowd> crowd) {
    std::ofstream file("crowd.txt");
    boost::archive::text_oarchive oa(file);
    oa << crowd;
    file.close();
 }

和内部循环(在Crowd的成员函数内部)我这样调用
 std::thread t(&Crowd::asyncSaveCrowd, this, this);

(我也尝试了异步调用,但它是相同的)

目前,我有工作线程仅在等待从线程安全队列读取并进行序列化,但是我想避免使用此工作线程和队列,并且对于每次序列化都将触发异步任务,其中将共享ptr作为参数传递。

最佳答案

最好的解决方案可能是将线程或将来的对象存储在容器中,并在循环结束时等待结果:

std::vector<std::thread> threads;
for (...) {
    threads.emplace_back(&Crowd::asyncSaveCrowd, this, this);
}
for (auto&& thread : threads) {
    thread.join();
}

如果异步操作不是在循环内直接创建的,则可以传递 vector 或返回线程/ future 对象。

09-25 21:44