• C++多线程学习10 promise和future多线程异步传值


    进程的执行具有间断性,进程按格子独立的、不可预知的速度向前推进。什么时候获得线程中的某个结果是不确定的。
    想要获得线程的确定的计算结果,使用之前的锁的策略也能实现,但比较麻烦,因此有必要使用更简洁的promise 和 future

    假设线程1需要线程2的数据,那么组合使用方式如下:

    线程1初始化一个promise对象和一个future对象,promise传递给线程2,相当于线程2对线程1的一个承诺;future相当于一个接受一个承诺,用来获取未来线程2传递的值
    线程2获取到promise后,需要对这个promise传递有关的数据,之后线程1的future就可以获取数据了。
    如果线程1想要获取数据,而线程2未给出数据,则线程1阻塞,直到线程2的数据到达
    一个简单的说明流程:
    在这里插入图片描述
    来源:图解future和promise

    future_status有三种状态:
    (1)deferred:异步操作还没开始
    (2)ready:异步操作已经完成
    (3)timeout:异步操作超时

    future提供了一些函数比如get(),wait(),wait_for():
    (1)get()来获取future所得到的结果,如果异步操作还没有结束,那么会在此等待set_value()设置共享状态的值,此后 promise 的共享状态标志变为 ready,并获取返回的结果。
    (2)wait()只是在此等待异步操作的结束,并不能获得返回结果。
    (3)wait_for()超时等待返回结果。
    参考:https://zhuanlan.zhihu.com/p/448035015

    要引入future库

    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    void TestFuture(promise<string> p)
    {
        cout << "begin TestFuture" << endl;
        this_thread::sleep_for(3s);
        cout << "begin set value" << endl;
        p.set_value("TestFuture value");
        this_thread::sleep_for(3s);
        cout << "end TestFuture" << endl;
    }
    
    int main(int argc, char* argv[])
    {
        //异步传输变量存储
        promise<string> p;
        //用来获取线程异步值获取
        auto future = p.get_future();
        auto th = thread(TestFuture, move(p));
     
            cout << "future get() = " << future.get() << endl;
    
        th.join();
        getchar();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    先创建一个测试线程对主线程的承诺p,再从p中获得future对象,用这个对象做为信物来接收承诺P产生的值,在创建线程的时候将这个承诺传过去,然后主线程想要获得信物的值,在测试线程对承诺设置值之前主线程将在get那等待,设置好值后将返回这个值:
    在这里插入图片描述
    注意,使用promise机制来创建线程的时候promise类型为std::promisestd::string&&,即右值引用,所以要用move()让P这里能当做右值使用,才能与右值引用匹配:
    在这里插入图片描述

  • 相关阅读:
    【数据结构】链表的大概认识及单链表的实现
    win11如何双屏幕(1台主机2块显示器)
    算法——单调队列
    动环监控安装及调试过程,动环监控调试是什么
    STM32CubeMX教程9 USART/UART 异步通信
    音乐APP首页框架搭建
    文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于网源协同多阶段投资规划的配电网过网费机制设计》
    面试题____Java小白找工作必须领悟的修仙秘籍(二)
    对称、群论与魔术(十一)——魔术《百变箭头》等和系列总结
    驶入脱贫“高速路”-国稻种芯-通榆县:稻谷农特产品推送进城
  • 原文地址:https://blog.csdn.net/qq_42567607/article/details/126075571