什么时候应该使用std::async和sync作为策略

When should I use std::async with sync as policy?

本文关键字:sync 策略 async 什么时候 std      更新时间:2023-10-16

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

Jagannath链接的非常有用的文章的摘要,以及对可能用途的评论。

有3种发布策略:

  • any:库选择是否生成线程a
  • 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可以为您提供更好的控制,如果呼叫有副作用,这一点很重要。