cd中的std :: promise和std :: future

时间:2014-09-16 21:31:39

标签: c++ multithreading

  

std :: promise提供了一种设置值(类型为T)的方法   以后可以通过关联的std :: future对象

来读取
  1. 这两者究竟有何联系?

  2. 我的担忧是否合理,未来会与错误的承诺配对?

  3. 更新:来自行动中的并发的示例...(但代码无法编译)

    #include <future>
    void process_connections(connection_set& connections)
    {
        while(!done(connections)){
            for(connection_iterator
            connection=connections.begin(),end=connections.end();
            connection!=end;
            ++connection)
            {
                if(connection->has_incoming_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);
                }
            }
        }
    }
    

3 个答案:

答案 0 :(得分:4)

  1. promisefuture视为为数据创建一次性使用渠道。 promise创建频道,并最终使用promise::set_value将数据写入其中。 future连接到频道,future::wait会在数据写入后读取并返回数据。

  2. 没有真正关心,因为唯一的方式是&#34;配对&#34;带有future promise的{​​{1}}与promise::get_future

答案 1 :(得分:2)

  1. 它们由std::promise::get_future成员函数关联。您可以通过调用此函数获得与std::future相关联的std::promise

    std::future表示您尚未拥有但最终会拥有的值。它提供了检查值是否可用的功能,或等待它可用的功能。

    std::promise承诺您最终会设置一个值。最终设置一个值时,它将通过相应的std::future

  2. 提供
  3. 不,因为您在创建后不会将它们配对。您从std::future获得std::promise,因此它们本身就是相关联的。

答案 2 :(得分:0)

std::promise<class T> promiseObj;

  1. promise对象创建一个可以存储类型T的值的容器

std::future<class T> futureObj = promiseObj.get_future();

  1. 将来的对象只要具有一定的价值,就会检索promise对象创建的容器中的内容。将来的对象需要与Promise对象创建的容器相关联,这可以通过上面的代码段完成。 因此,如果您将future与预期的promise对象关联,那么就不会出现future与错误的promise对象配对的情况。

  2. 这是一个示例程序,可以明确说明将来的用法:

    #include <iostream>
    #include <thread>
    #include <future>
    
    //Some Class will complex functions that you want to do in parallel running thread
    class MyClass
    {
    public:
        static void add(int a, int b, std::promise<int> * promObj)
        {
            //Some complex calculations
            int c = a + b;
    
            //Set int c in container provided by promise
            promObj->set_value(c);
        }
    };
    
    int main()
    {
        MyClass myclass;
    
        //Promise provides a container
        std::promise<int> promiseObj;
    
        //By future we can access the values in container created by promise
        std::future<int> futureObj = promiseObj.get_future();
    
        //Init thread with function parameter of called function and pass promise object
        std::thread th(myclass.add, 7, 8, &promiseObj);
    
        //Detach thread
        th.detach();
    
        //Get values from future object
        std::cout<<futureObj.get()<<std::endl;
    
        return 0;
    }