微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从线程返回类对象并创建返回对象的向量?

如何解决如何从线程返回类对象并创建返回对象的向量?

我想使用 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 举报,一经查实,本站将立刻删除。