如何在没有等待结果的情况下触发循环异步任务

时间:2014-05-31 20:17:46

标签: c++ c++11

我需要内部循环来存储文件一些对象(每隔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作为参数传递。

1 个答案:

答案 0 :(得分:2)

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

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

如果未在循环中直接创建异步操作,则可以传递向量或返回线程 / 未来对象。