std :: async有一个重载,它将std :: launch策略作为第一个参数。我什么时候应该使用这个过载?有哪些不同的政策? (我认为同步和异步是两个选项)。我应该何时使用同步政策?与直接运行它有何不同?
答案 0 :(得分:5)
the very helpful article that Jagannath linked摘要,以及对可能用途的评论。
有3个发布政策:
any
:图书馆选择是否生成线程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
可以让您更好地控制,如果调用有副作用,这一点非常重要。