std::async 与线程

Vic*_*r M 5 c++ multithreading stdasync

我试图了解async与使用线程到底有什么不同。在概念层面上,我认为多线程根据定义是异步的,因为您正在线程之间进行 I/O 等上下文切换。

但似乎即使对于单线程应用程序之类的实例,仅添加线程也与使用async. 例如:

#include <iostream>       // std::cout
#include <future>         // std::async, std::future

// a non-optimized way of checking for prime numbers:
bool is_prime (int x) {
  std::cout << "Calculating. Please, wait...\n";
  for (int i=2; i<x; ++i) if (x%i==0) return false;
  return true;
}

int main ()
{
  // call is_prime(313222313) asynchronously:
  std::future<bool> fut = std::async (is_prime,313222313);

  std::cout << "Checking whether 313222313 is prime.\n";
  // ...

  bool ret = fut.get();      // waits for is_prime to return

  if (ret) std::cout << "It is prime!\n";
  else std::cout << "It is not prime.\n";

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能创建一个线程来调用is_prime写入某个变量,然后join()在打印该变量之前调用?如果我能做到这一点,那么使用 的真正好处是什么async?一些具体的例子会非常有帮助。

nvo*_*igt 2

这不是 C++ 特有的,所以我尝试通用一点。我确信 C++ 也有特定的怪癖。

一般来说,是的。您可以为输出创建一个变量,启动一个线程,将变量的地址提供给线程,然后加入线程并在线程写入变量后访问该变量。这样可行。没有什么问题。我们这样做了很多年。

但随着程序变得越来越复杂,这会变得越来越混乱。越来越多的线程需要继续运行,越来越多的变量需要记住何时以及如何安全地访问它们。我可以i在此处打印,还是需要先加入特定线程?谁知道。

Future(或 Promises 或 Task)和 async/await 是当今许多语言使用的模式,名称或非常相似。它们没有做任何我们以前做不到的事情,但是当程序增长并且不再是每个人都可以在一个屏幕上阅读的一页示例程序时,它们使维护变得更加容易。