【问题标题】:std::async vs. thread [duplicate]std::async 与线程 [重复]
【发布时间】:2021-03-25 16:09:38
【问题描述】:

我试图了解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;
}

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

【问题讨论】:

  • 您可以创建一个线程,但这并没有为您提供任何与它同步的固有方法。 IE。您还需要一个互斥锁和/或条件变量等,以便知道线程中的计算完成。 std::async 会为您解决这个问题。这并不是说它总是正确的选择,但如果您只是想计算一个与“主”代码并行的一次性结果,那肯定很方便。

标签: c++ multithreading stdasync


【解决方案1】:

这不是 C++ 特定的,所以我尽量笼统一点。我敢肯定还有 C++ 特有的怪癖。

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

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

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

【讨论】:

  • This is not C++ specific - 怎么样?
  • 可能是因为线程和异步与 C++ 本身无关。许多语言都有这些抽象。
  • 我不同意。这是关于std::threadstd::asyncstd::future等的全部内容
  • @SergeyA 对不起,你读过我的帖子吗? " 是当今许多语言以这些或非常相似的名称使用的模式"
  • @SergeyA 对于 C++,我的回答是 吗?我正在等待您详细解答std::futureFuture&lt;&gt; 的根本不同以及std::asyncasync 的根本不同。一个概念可以适用于多种语言,C++ 根本不是一种独特的编程语言……实际上这种特定模式已经很晚了。
猜你喜欢
  • 1970-01-01
  • 2015-08-28
  • 2021-11-24
  • 2012-07-13
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
相关资源
最近更新 更多