gpt4 book ai didi

C++11 树上的异步操作

转载 作者:太空狗 更新时间:2023-10-29 20:44:31 25 4
gpt4 key购买 nike

我正在实现一个树数据结构并对其进行一些操作。每个节点都有一些值,指向其父节点的指针和其子节点的列表。我已经实现了一个函数 max_value,它递归地遍历树并找到存储在节点中的最大值。现在,我想使用 C++11 标准实现一个执行相同操作的异步函数。我有以下代码:

template<typename T>
T Node<T>::max_value_async(void)
{
T current_value = p_value;
list<future<T>> results;
//launch tasks
for ( auto x : p_children)
{
results.insert(async(std::launch::async, x.max_value));
}
//wait for results
for (auto r : results)
r.wait();
//find highest value
for (auto r : results)
{
if (current_value < r.get())
current_value = r.get();
}

return current_value;
}

但我在启动异步功能时遇到了麻烦。怎么了?

最佳答案

有几个问题:

  • 首先,不需要使用 wait(),因为 get() 暗示了这一点。
  • listvector 均可与 push_back 配合使用。您为 list::insert 提供了错误数量的参数。最好的方法是使用 emplace_back
  • 的就地构造
  • 您似乎也应该只执行一次.get()。对 get() 的后续调用会产生 std::future_error 异常。
  • 您用于构建 future 的语法不存在。这执行此类操作的最简单方法是使用如下所示的 lambda。

完整示例:

// g++ -pthread -std=c++0x 
#include <iostream>
#include <future>
#include <list>

struct X {
X(int v) : mv(v) {}
int mv;
int max_value() const {
return mv;
}
};

int main(){
std::list<std::future<int> > results;
X x4(4);
X x5(5);
X x3(3);

results.emplace_back(std::async(std::launch::async,
[&x4](){ return x4.max_value();}));
results.emplace_back(std::async(std::launch::async,
[&x5](){ return x5.max_value();}));
results.emplace_back(std::async(std::launch::async,
[&x3](){ return x3.max_value();}));

// for sure there's better ways to do this step, but for clarity:
int best_value=0;
for (auto &r : results){
auto this_value=r.get();
if (best_value < this_value)
best_value = this_value;
}

std:: cout << best_value << std::endl;
}

由于您使用共享指针,您还可以让 lambda 按值获取对象,

std::shared_ptr<SomeT> some_obj= ... from somewhere... ;
results.emplace_back(
std::async(
std::launch::async, [some_obj](){ return some_obs->max_value();}
)
);

关于C++11 树上的异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13098484/

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