什么时候应该使用std::async和sync作为策略
When should I use std::async with sync as policy?
std::async有一个重载,它将std::launch策略作为第一个参数。我什么时候应该使用这种过载?有哪些不同的政策?(我认为同步和异步是两种选择)。我应该何时使用同步策略?这与直接运行有什么不同?
Jagannath链接的非常有用的文章的摘要,以及对可能用途的评论。
有3种发布策略:
any
:库选择是否生成线程aasync
:您明确要求生成一个线程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
可以为您提供更好的控制,如果呼叫有副作用,这一点很重要。
相关文章:
- C++17中的并行执行策略
- 运行时执行策略不同
- 编译器上的策略数据结构不起作用
- 我应该在简单的策略游戏中为各个派系使用类吗 - C++
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 没有执行策略的 std::transform_reduce 是可移植的吗?
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 使用 Qt5 SQL 进行异步数据库访问的策略
- C++基于策略的设计:继承与组合
- 当PSO细粒度策略对使用AdsGetObject MSDN API的Windows操作系统生效时,如何获取用户密码到期日
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 如何实例化基于输入的策略模式
- 使用策略模式设计软件时出现的问题
- 在发送源代码时省略未使用的boost src文件的策略
- 使用 redis 进行日志缓存:是否可以创建逐出到 PostgreSQL 的逐出策略?
- CMAKE:前导或尾随空格(策略CMP0004)
- 转换非常长的字符串文本C++以满足最大行长策略
- 在插入顺序已知时填充 Eigen3 稀疏矩阵的策略
- C++ 中的执行策略
- 什么时候应该使用std::async和sync作为策略