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(...),系统自动选择发射策略,如果可以立即启动,那么就启动线程,否则推迟启动线程。

  • 相关阅读:
    Repeater自定义翻页 存储过程实现
    Redis常用命令
    常用的富文本框插件FreeTextBox、CuteEditor、CKEditor、FCKEditor、TinyMCE、KindEditor ;和CKEditor实例
    网站转接支付宝解决方案
    如何有效抓取SQL Server的BLOCKING信息
    SVN 冲突文件详解
    JavaScript可否多线程? 深入理解JavaScript定时机制
    MS SQL Server:分区表、分区索引详解
    支付宝外部商家购物流程
    排查数据库性能的常用sql语句
  • 原文地址:https://www.cnblogs.com/yxsrt/p/12995275.html
Copyright © 2011-2022 走看看