C++并发实战13:std::future、std::async、std::promise、std::packaged_task(二)

2014-11-24 03:30:33 · 作者: · 浏览: 1
联。调用share()的future不再和共享状态关联,如future f=async(task); shared_future sh=f.share(); f.get(); f.get()*2; bool valid() const noexcept;//若future和共享状态关联则返回true,否则返回false T get();//若future和某个T类型的共享状态关联,那么调用future::get(),若该状态还没有准备好阻塞线程直到准备好,若状态准备好了,则返回该状态值,并将future和共享状态解绑,此future将invalid void wait() const;//阻塞等待共享状态就绪 future_status wait_for (const chrono::duration & rel_time) const;//在rel_time时间内等待共享状态值就绪 future_status wait_until (const chrono::time_point & abs_time) const;//直到abs_time时刻等待共享状态就绪

future_status:

返回值 描述
future_status::ready 共享状态的标志已经变为 ready,即 Provider 在共享状态上设置了值或者异常。
future_status::timeout 超时,即在规定的时间内共享状态的标志没有变为 ready。
future_status::deferred 共享状态包含一个 deferred 函数。

2.2 async开启后台线程执行任务

async (Fn&& fn, Args&&... args);//自动选择线程执行任务fn,args是fn的参数,若fn是某个对象的非静态成员函数那么第一个args必须是对象的名字,后面的args是fn所需的参数

async (launch policy, Fn&& fn, Args&&... args);//有三种方式policy执行任务fn
policy=launch::async表示开启一个新的线程执行fn
policy=launch::deferred 表示fn推迟到future::wait/get时才执行
policy=launch::async|launch::deferred表示由库自动选择哪种机制执行fn,和第一种构造方式async(fn,args)策略相同


2.3 packaged_task类似与std::function但是其允许异步存取结果,其内部持有一个函数调用和共享状态,该共享状态可以被packaged_task返回的future获取。

packaged_task() noexcept;//空的packaged_task对象,没有共享状态和内部函数
explicit packaged_task (Fn&& fn);//内部有共享状态和函数fn
explicit packaged_task (allocator_arg_t aa, const Alloc& alloc, Fn&& fn);//共享状态通过alloc分配内存(该共享状态可能是个buffer)
packaged_task (const packaged_task&) = delete;//禁止拷贝构造
packaged_task (packaged_task&& x) noexcept;//具有移动语义

~packaged_task();//丢弃共享状态,若还有future和共享状态关联,那么共享状态不会被销毁直到future销毁,如果析构发生时共享状态还没有被设置那么析构将设置共享状态并在状态里加入异常

packaged_task& operator= (packaged_task&& rhs) noexcept;//rhs的共享状态将被移动,rhs将没有共享状态
ackaged_task& operator= (const packaged_task&) = delete;//禁止拷贝

bool valid() const noexcept;//若packaged_task内部有共享状态则返回true,否则返回false
future
  
    get_future();//返回一个future用以获得共享状态,该函数只能被调用一次

void operator()(Args... args);//执行fn,若成功则将结果写入共享状态,若失败则写入异常到共享状态,通过future::get()可以获取该状态
void make_ready_at_thread_exit (args... args);//结果介入共享状态,但是在该函数所在的调用线程结束后才使共享状态就绪,即该线程结束后future::get()才能获取状态值,若在写入状态值和线程没有退出期间有写入该状态的行为将抛出future_error的异常

void swap (packaged_task& x) noexcept;//交换两个packaged_task的内部share state 和 callable object

  

2.4 promise可以存入一个共享状态值,相关的std::future可以获取该值

promise();//空的promise对象,没有共享状态值
template 
  
    promise (allocator_arg_t aa, const Alloc& alloc);//Alloc将为共享状态值开辟内存
promise (const promise&) = delete;//禁止拷贝赋值
romise (promise&& x) noexcept;//具备移动语义
~promise();//和~packaged_task()语义一样

promise& operator= (promise&& rhs) noexcept;//移动赋值,rhs不再有共享状态
promise& operator= (const promise&) = delete;

future
   
     get_future();//返回一个future和共享状态关联,可以通过此future获取共享状态的值或异常,该函数只能被调用一次 void set_value (const T& val);//设置共享状态的值 void set_value (const T& val); void promise
    
     ::set_value (R& val); // when T is a reference type (R&) void promise
     
      ::set_value (void); // when T is void void set_exception (exception_ptr p);//设置异常指针p到共享状态中,若状态关联的future::get()会获得该异常(并解除阻塞) void set_value_at_thread_exit (const T& val);//和packaged_task::make_ready_at_thread_exit()语义一样 void set_value_at_thread_exit (T&& val); void promise
      
       ::set_value_at_thread_exit (R& val); // when T is a reference type (R&) void pr