如何解决如何从线程返回类对象并创建返回对象的向量?
我想使用 C++11 std::thread
。我正在编写代码来解析 JSON 文件,并且解析不相互依赖。我有 900 个文件,为了提高执行速度,我想创建尽可能多的线程并使执行并行。
我的问题是目前我想传递给 std::thread
的函数是一个类的函数,它将解析的对象作为 JSON 对象返回,我从中创建了一个 std::vector
。
我在 Google 上搜索了“从线程返回值”,并获得了使用 async
的教程,除了异步之外还有其他方法吗?我浏览了异步教程,但无法理解它是如何启动新线程的。
以下是我的代码:
for (auto it = jsonFilesList.begin(); it != jsonFilesList.end(); it++) {
std::ifstream jsonFile;
jsonFile.open(*it);
jf = json::parse(jsonFile);
jsonFile.close();
jsonObjects.push_back(jf);
}
我想将函数 parse(jsonFile)
传递给我的线程,对 JSON 文件总数进行编号,并返回 json 对象,我将使用它来创建一个 std::vector
的 jsonObjects。
我该怎么做?
解决方法
使用 std::async
似乎是一个好方法,因为它返回一个 std::future
,您可以从中获取返回值。
这是一个简短的示例,您可以将其用作开始工作的想法。
#include <iostream>
#include <future>
#include <vector>
int doWork(int i) {
return i*2;
}
int main()
{
std::vector<int> results;
std::vector<std::future<int>> work;
for (int i = 0; i < 10; ++i) {
work.emplace_back(std::async(std::launch::async,&doWork,i));
}
// do some other stuff,or nothing
// before getting the results from all the futures
for (auto& future : work) {
results.emplace_back(future.get());
}
for(auto i : results) {
std::cout << i << '\n';
}
return 0;
}
std::future 还具有成员函数,例如 valid、wait、wait_for 和 wait_until,如果您希望在检索值的方式方面具有更大的灵活性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。