何时需要使用std::async(std::launch::asyncfunc())而不是func(()
When should I need to use std::async(std::launch::async, func()) instead of func()?
我不明白使用带有std::lauch::async
标志的std::async
,而不是简单地调用传递给std::async
的函数背后的原因。有什么特别保证吗?
根据文档,有一个重载,它只接受函数及其参数。您使用的重载接受更具体的策略。
async(f, args...)
等效于async(std::launch::async | std::launch::deferred, f, args...)
,其中两个标志的存在将取决于该函数是简单地从当前调用堆栈解耦(推迟到第一个非定时等待函数的执行;这被称为延迟求值),还是实际上是多线程的。
您正在使用的调用,通过只给std::launch::async
,确保函数在自己的线程中明确执行,避免任何阻塞调用线程的工作。
当然,这两种变体仍然与直接调用f(args...)
完全不同,后者保证了立即评估。
是的,调用线程不会阻塞,因为std::async会生成一个单独的线程来调用函数。这意味着,如果您单击GUI按钮开始处理一个复杂的任务,这将需要几分钟的时间,那么GUI会做出响应,尽管处理尚未完成。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 标准C++11是否保证std::async(std::launch::asyncfunc)在单独的线程中启动func
- 类中带有std::bind(func,this)的std::packaged_task
- 何时需要使用std::async(std::launch::asyncfunc())而不是func(()
- 以自然(非反向)顺序将func应用于std::tuple中的元素
- set_new_handler (std::new_handler func) 失败后的构造函数调用,用于内存分配失败