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 <thread>
#include <iostream>
#include <future>
#include <string>
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;
}

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

猜你喜欢

转载自blog.csdn.net/qq_42567607/article/details/126075571