什么时候应该使用std :: async同步作为策略?

时间:2012-02-11 11:23:28

标签: c++ asynchronous c++11

std :: async有一个重载,它将std :: launch策略作为第一个参数。我什么时候应该使用这个过载?有哪些不同的政策? (我认为同步和异步是两个选项)。我应该何时使用同步政策?与直接运行它有何不同?

1 个答案:

答案 0 :(得分:5)

the very helpful article that Jagannath linked摘要,以及对可能用途的评论。

有3个发布政策:

  • any:图书馆选择是否生成线程
  • async:您明确要求生成一个主题
  • deferred:您明确要求生成 的主题

因此,deferred政策是获取确定性延迟评估(也称为需要调用)的一种方式。例如,假设您有:

void MyClass::lazy(std::future<int> const& f) {
  if (this->notReady()) { return; }
  if (this->stillNotReady()) { return; }
  if (this->value() == 42) { return; }

  this->go(f.get());
}

现在,如果计算此整数的值是 long (例如,它可能会调用网络往返),那么在所有不需要它的情况下计算它是浪费的......现在我们有了这样做的工具!

void func(MyClass& mc) {
  std::future<int> f = std::async(std::launch::deferred, []() {
                         return stoi(memcached.get("KEY"));
                       });

  mc.lazy(f);
}

请注意,与使用std::function<int()>(以及闭包)略有不同,因为计算是一次完成,保证后续调用get总是返回相同的结果。

与其他策略的区别也可以表示当您不需要值时是否执行操作

  • any:可能在另一个主题上执行(主动)或根本不执行
  • async:将在另一个线程上执行
  • deferred:将执行

因此,deferred可以让您更好地控制,如果调用有副作用,这一点非常重要。