zoukankan      html  css  js  c++  java
  • C++11 promise、future和async

      C++11提供了操作线程的几个高级接口,分别为函数async(), promise和future。

      async用于异步启动一个线程,并返回一个future对象。注意,async不一定会马上启动线程,所以如果想要立刻启动线程,可以通过future对象调用get()或直接在async中加入std::launch::async参数来激活异步线程。这两者的区别是,在没有加入发射参数的情况下,如果没有调用get(),那么可能在程序结束时也不会启动线程。而在加入发射参数的情况下,返回的future对象在生命周期结束前,一定会等待线程执行结束,因此这种情况下如果没有保存返回的future,那么程序会在这里同步等待线程执行结束。launch下还有一个deferred参数,加入该参数保证线程在future对象调用get()时启动,可以用于缓式求值。

      可以调用future对象的wait_for(chrono::second(0))来判断线程的运行情况,比如用于轮询该线程是否已执行完毕。注意,该函数的返回值有三种情况:未启动,逾期,已完成。

      promise用于存储一个值,并通过与之关联的future来取得promise中的值。promise调用get_future()来返回与之配对的future。注意,promise不支持copy语义,需要通过引用或移动的方式来传递promise。

      async()的三种典型用法:

      1)async(std::launch::async, ...),这种调用会立即启动一个线程,并且该线程保证在返回的future被销毁时完成工作,或者对返回的future调用get()或wait()。

      2)async(std::launch::deferred, ...),这种调用会在返回的future调用wait()或get()时启动线程,可相当于推迟的同步调用。如果不调用get()或wait(),则线程不会启动。

      3)async(...),系统自动选择发射策略,如果可以立即启动,那么就启动线程,否则推迟启动线程。

  • 相关阅读:
    Unix进程和线程管理及其异同
    UnixIPC之共享内存
    Unix/Linux常用文件操作
    java中int和Integer比较
    JAVA四种引用类型
    JAVA-Exception&Error
    JAVA特性-跨平台/面向对象
    JAVA单向链表实现
    linux安装及配置c++的opencv库
    static_cast、const_cast、dynamic_cast、reinterpret_cast
  • 原文地址:https://www.cnblogs.com/yxsrt/p/12995275.html
Copyright © 2011-2022 走看看