c++ - 我什么时候应该使用 std::async with sync 作为策略?

标签 c++ asynchronous c++11

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

最佳答案

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

有 3 种启动策略:

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

关于c++ - 我什么时候应该使用 std::async with sync 作为策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9239811/

相关文章:

C++11 类属性作为另一个对象?

c++ - 与第三方库相关的最常见的 C++ 项目目录结构约定

c++ - 在 C++ 中,用户将数据输入二维数组的最简单方法是什么?

c++ - 在 MCA 8000A 中编写 Linux 驱动程序

c++ - C++ 中的全局数组

c# - 我在哪里可以找到异步队列的当前内容?

c# - async 和await 如何替代现有方法?

http - Web 服务器 - 如何解析请求?异步流标记器?

C++ vector 迭代器错误

c++11 - 将计时持续时间转换为 time_point