使用std::promise

直接看std::promise如何使用吧。(《并发编程》这段实在太抽象直接跳过吧。。。)我们用std::promise<bool>std::future<bool>来标识一块数据是否成功传输。

#include <future>
void proces_connections(connection_set& connections)
{
    while(!done(connections))
    {
        for(connection_iterator connection = connections.begin(), end = connections.end(); connections != 
            end; ++connections)
        {
            if(connection->has_in_comming_data())
            {
                data_packet data = connection->incoming();
                std::promise<payload_type>& p = connection->get_promise(data.id);
                p.set_value(data.payload);
            }
            if(connection->has_outgoing_data())
            {
                outgoing_packet data = connection->top_of_outgoing_queue();
                connection->send(data.payload);
                data.promise.set_value(true);
            }
        }
    }
}

这段太抽象,不想讲解了。。。直接看CSDN的代码吧:


#include <iostream>
#include <future>
#include <chrono>

void Thread_Fun1(std::promise<int> &p)
{
    //为了突出效果,可以使线程休眠5s
    std::this_thread::sleep_for(std::chrono::seconds(5));
 
    int iVal = 233;
    std::cout << "传入数据(int):" << iVal << std::endl;
 
    //传入数据iVal
    p.set_value(iVal);
}
 
void Thread_Fun2(std::future<int> &f)
{
    //阻塞函数,直到收到相关联的std::promise对象传入的数据
    auto iVal = f.get();        //iVal = 233
 
    std::cout << "收到数据(int):" << iVal << std::endl;
}
 
int main()
{
    //声明一个std::promise对象pr1,其保存的值类型为int
    std::promise<int> pr1;
    //声明一个std::future对象fu1,并通过std::promise的get_future()函数与pr1绑定
    std::future<int> fu1 = pr1.get_future();
 
    //创建一个线程t1,将函数Thread_Fun1及对象pr1放在线程里面执行
    std::thread t1(Thread_Fun1, std::ref(pr1));
    //创建一个线程t2,将函数Thread_Fun2及对象fu1放在线程里面执行
    std::thread t2(Thread_Fun2, std::ref(fu1));
 
    //阻塞至线程结束
    t1.join();
    t2.join();
 
    return 1;
}

控制台会在5秒后输出:

传入数据(int):233
收到数据(int):233

main函数中,先通过get_future获取与std::promise绑定的future对象。随后分别启动两个线程,分别传入promisefuture。线程1在休眠5秒后调用set_value()设置promise的值,future将会变为就绪,随后一直处于阻塞的线程2可以调用get()获取值。