gpt4 book ai didi

multithreading - 使用 std::future 从函数返回多个值

转载 作者:行者123 更新时间:2023-12-04 06:56:50 25 4
gpt4 key购买 nike

根据this Q&A ,如果函数返回一个值,则 std::future 可以工作,但您无法传递引用并获取多个值。因此,像这样的函数不会给出 std::future 的结果:

void doSomething(int &a, int &b) { a = 1; b = 2; }

我的想法是创建一个结构并让函数返回该结构:

#include <iostream>
#include <future>
using namespace std;

struct myData
{
int a;
int b;
};

myData doSomething()
{
myData d;
d.a = 1;
d.b = 2;
return d;
}

int main()
{
future<myData> t1 = async(launch::deferred, doSomething);

printf("A=%d, B=%d\n", t1.get().a, t1.get().b);

return 0;
}

那么,如何从 std::future 获取两个或多个值? 还有比这更好的方法吗?

最佳答案

but you can't pass references and get multiple values.

不正确,正如链接问题的答案中所解释的,您可以传递引用,您只需要使用std::ref来保护它们免于衰减。因此,要调用 void doSomething(int &a, int &b) 您将使用:

int a;
int b;
auto fut = std::async(std::launch::deferred, doSomething, std::ref(a), std::ref(b));
fut.get(); // wait for future to be ready
std::printf("A=%d, B=%d\n", a, b);

但是该函数不会返回多个值,它使用输出参数来设置多个变量。对于返回多个值的函数,您确实需要返回某种复合类型,例如结构体,但这与 std::future 无关,这就是 C++ 的工作原理。函数具有单一返回类型。

返回结构体的解决方案是惯用的方式,尽管您的代码在运行时会失败,因为您使用 t1.get() 两次,并且只能从 检索结果>std::future 一次。要访问结果两次,请将结果移动到新变量中:

auto result = t1.get();

或者将 future 转换为 std::shared_future ,这样可以多次访问结果:

auto t2 = t1.share();

但是您不需要使用自定义结构来返回多个值,您可以只使用元组:

#include <cstdio>
#include <future>
#include <tuple>

std::tuple<int, int> doSomething()
{
return std::make_tuple(1, 2);
}

int main()
{
auto fut = std::async(std::launch::deferred, doSomething);
auto result = fut.get();
std::printf("A=%d, B=%d\n", std::get<0>(result), std::get<1>(result));
}

关于multithreading - 使用 std::future 从函数返回多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28473695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com