接近 this clip 的开头从 C++ And Beyond,我听说了一些关于 std::async
的问题。我有两个问题:
对于初级开发者,在使用
std::async
时是否有一套规则来说明该做什么和该避免什么?此视频中存在哪些问题?他们是否与 this article 相关? ?
最佳答案
有几个问题:
-
没有启动策略的
std::async
允许运行时库选择是启动新线程还是在调用get()
的线程中运行任务> 或wait()
在未来。正如 Herb 所说,这是您最可能想要使用的情况。问题在于,这让运行时库的 QoI 开放以获得正确的线程数量,并且您不知道任务是否会拥有自己的线程,因此使用线程局部变量可能会出现问题。据我了解,这就是 Scott 关心的问题。在您明确调用
get()
或wait 之前,使用
。这几乎不是你想要的,所以不要那样做。std::launch::deferred
策略实际上不会运行任务()使用
std::launch::async
的策略启动一个新线程。如果您不跟踪您有多少线程,这可能会导致运行的线程过多。Herb 担心
std::future
析构函数的行为,该析构函数应该等待任务完成,尽管 MSVC2012 存在不等待的错误.
对于初级开发人员,我建议:
- 将
std::async
与默认启动策略一起使用。 - 确保您明确等待所有 future 。
- 不要在异步任务中使用线程本地存储。
关于c++ - std::async 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12508653/