• 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这里能当做右值使用,才能与右值引用匹配:
    在这里插入图片描述

  • 相关阅读:
    计算机五大部件是指什么
    【Arduino+ESP32专题】PlatformIO工具栏介绍
    Visual Studio自定义模板参数、备注
    并发编程day01
    javascript 根据数组指定字段值,实现升序/降序
    Android框架mqtt库无法兼容高版本android13的问题
    【Pygame 学习笔记】8.精灵
    Mac 使用 vscode 写 latex
    t-SNE可视化-Python实现
    vscode-server安装和部分配置
  • 原文地址:https://blog.csdn.net/qq_42567607/article/details/126075571