gpt4 book ai didi

c++ - C++11 可变数量的异步线程

转载 作者:可可西里 更新时间:2023-11-01 18:04:53 26 4
gpt4 key购买 nike

我正在开发一个我想在循环中使用异步的程序。在我包含的示例代码中只有 10 个元素,因此我可以轻松地为每个元素创建一个显式变量。但是,在我的主程序中, vector 中的元素数量可能会有所不同。理想情况下,我想创建一个异步线程 vector - 数组中的每个元素一个 - 在我循环遍历时被推回到异步 vector 上。然后我想等待它们全部完成,然后使用“get()"返回所有输出。

下面的代码将通过为每个线程分配一个显式变量来调用 async,但是有谁知道如何在 vector 中动态调用 async 而不必为其显式分配变量?理想情况下,我希望这个程序在每次循环时调用一次“std::cout”,而不是只调用一次。

#include <iostream>
#include <vector>
#include <string>
#include <future>

std::string hi (std::string input)
{
return "hello, this is " + input;
}

int main()
{
std::vector<std::string> test_vector( 10, "a test" );
std::future<std::string> a;
std::future<std::string> b;

for ( int i = 0; i < test_vector.size ( ); i++ )
{
a = std::async(std::launch::async, hi, test_vector[i]);
}

std::cout << a.get() << std::endl;

return 0;
}

最佳答案

你可以通过创建一个 future vector 来匹配你的线程 vector 来解决这个问题,就像这样:

#include <iostream>
#include <vector>
#include <string>
#include <future>

std::string hi(const std::string& input)
{
return "hello, this is " + input;
}

int main()
{
std::vector<std::string> tests = {"one", "two", "three", "four"};
std::vector<std::future<std::string>> futures;

// add the futures to the futures vector as you launch
// your asynchronous functions
for(auto&& t: tests)
futures.emplace_back(std::async(std::launch::async, hi, std::cref(t)));

// collect your results
for(auto&& f: futures)
std::cout << f.get() << '\n';
}

注意 std::cref 的使用通过常量引用。使用 std::ref传递非常量引用

关于c++ - C++11 可变数量的异步线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26964915/

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