我需要内部循环来存储文件(每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 对象。