C ++ 11树上的异步操作

时间:2012-10-27 08:24:20

标签: c++ asynchronous c++11 tree

我正在实现一个树数据结构和一些操作。每个节点都有一些值,指向其父节点及其子节点的指针。我已经实现了一个函数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;
}

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

1 个答案:

答案 0 :(得分:5)

有一些问题:

  • 首先,没有必要使用wait(),因为get()暗示了这一点。
  • listvector可以与push_back一起使用。您向list::insert提供了错误的参数数量。最好的方法是使用emplace_back
  • 进行就地构造
  • 您似乎也应该只进行一次.get()。对get()的后续调用会产生std::future_error例外。
  • 您用于构建期货的语法不存在。该 最简单的方法就是使用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();}
   )
);