future頭文件
future頭文件提供了這樣一種便利,允許異步訪問一個(gè)被一個(gè)特定的提供者設(shè)置的值,提供者和訪問者可以在不同的線程,它會(huì)保證不同線程之間的同步。
訪問者可以通過提供者(比如說promise)提供的future對(duì)象來訪問共享狀態(tài)(值)。
<future>頭文件包含了以下幾個(gè)類和函數(shù)
- Provider類:std::promise, std::package_task
- Future類 : std::future, shared_future
- Provider函數(shù):std::async()
- 其他
std::future
future對(duì)象可以從其他一些提供者對(duì)象或者函數(shù)獲取一個(gè)值。
合法(valid)的futures是一些關(guān)聯(lián)了共享狀態(tài)的future對(duì)象,可以通過如下函數(shù)來獲取。
- async
- promise::get_future
- packaged_task::get_future
記住只有合法的future對(duì)象才是有用的,使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建的future對(duì)象不是合法的(除非通過轉(zhuǎn)移賦值的方式把一個(gè)合法的future對(duì)象賦值給它了),也就是說直接定義的future對(duì)象沒有用。
一個(gè)合法的future對(duì)象的future::get函數(shù)會(huì)block線程,等待提供者吧共享狀態(tài)置成ready。
共享狀態(tài)的生命周期會(huì)一直延續(xù)到和它相關(guān)的最后一個(gè)對(duì)象被釋放或者銷毀了為止。
std::promise
promise是一個(gè)模板類,下面是它的三個(gè)聲明
template <class T> promise;
template <class R&> promise<R&>; //T是引用類型
template <> promise<void> // T 是一個(gè)void類型
promise這個(gè)對(duì)象保存了一個(gè)類型為T的值,這個(gè)值可以通過future對(duì)象來獲取(這個(gè)獲取的過程可能在另一個(gè)線程中發(fā)生),這個(gè)類提供了一種同步機(jī)制。
#include <iostream>
#include <functional> //std::ref
#include <thread>
#include <future>
void print_int(std::future<int>& fut)
{
int x = fut.get(); // 如果共享狀態(tài)沒有ready,線程會(huì)阻塞在這里,知道監(jiān)測(cè)到狀態(tài)ready了
std::cout << "value: " << x << std::endl;
}
int main()
{
std::promise<int> prom;
std::future<int> fut = prom.get_future(); // 返回的future對(duì)象和promise對(duì)象共享狀態(tài)相關(guān)聯(lián)
std::thread th1 (print_int, std::ref(fut)); // 通過引用的方式傳遞future對(duì)象給新創(chuàng)建的線程
prom.set_value(10); // set_value設(shè)置共享狀態(tài),并且promise的共享狀態(tài)標(biāo)志變成ready
th1.join();
return 0;
}