c++ - std::async 有什么问题?

标签 c++ multithreading c++11 stdasync

接近 this clip 的开头从 C++ And Beyond,我听说了一些关于 std::async 的问题。我有两个问题:

  1. 对于初级开发者,在使用 std::async 时是否有一套规则来说明该做什么和该避免什么?

  2. 此视频中存在哪些问题?他们是否与 this article 相关? ?

最佳答案

有几个问题:

    没有启动策略的
  1. std::async 允许运行时库选择是启动新线程还是在调用 get() 的线程中运行任务> 或 wait() 在未来。正如 Herb 所说,这是您最可能想要使用的情况。问题在于,这让运行时库的 QoI 开放以获得正确的线程数量,并且您不知道任务是否会拥有自己的线程,因此使用线程局部变量可能会出现问题。据我了解,这就是 Scott 关心的问题。

  2. 在您明确调用 get()wait 之前,使用 std::launch::deferred 策略实际上不会运行任务()。这几乎不是你想要的,所以不要那样做。

  3. 使用 std::launch::async 的策略启动一个新线程。如果您不跟踪您有多少线程,这可能会导致运行的线程过多。

  4. Herb 担心 std::future 析构函数的行为,该析构函数应该等待任务完成,尽管 MSVC2012 存在不等待的错误.

对于初级开发人员,我建议:

  • std::async 与默认启动策略一起使用。
  • 确保您明确等待所有 future 。
  • 不要在异步任务中使用线程本地存储。

关于c++ - std::async 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12508653/

相关文章:

c++ - 光流 - 运动直方图

C++ - 将 Vector 值分配给 std::string 而不会丢失数据

java - 我哪里不是线程安全的?

c++ - 为什么两阶段查找会无法选择 'swap' 的重载版本?

c++ - 如何使用三元运算符创建指向多态类的唯一指针?

C++ 内存垃圾处理

c++ - 仅在第一次使用变量时才计算变量的好模式是什么?

c# - 你如何处理一个有挂起调用的线程?

java - Spring数据redis并发问题

c++ - 任何好的 C++0x 概述?