std::promise
promise物件可以儲存某一t型別的值,該值可以被future物件(可能在另乙個執行緒中)獲取,因此promise也提供了一種同步手段。
在構造時,promise物件與乙個新的共享狀態(通常是std::future)相關聯,他們可以儲存t型別的值或從std::exception派生的異常。
共享狀態可以通過呼叫成員get_future來與future相關聯,呼叫後,兩個物件共享同乙個狀態:
1、promise物件是非同步的提供者,並在某一時刻為共享狀態設定值;
2、future物件是非同步返回共享狀態的值,它可以獲取非同步狀態的值(必要時阻塞等待狀態就緒);
我們來看乙個例子:
#include // std::cout
#include // std::ref
#include // std::thread
#include // std::promise, std::future
using namespace std;
void print_int(future& fut)
int main()
在上述**中,pormise物件呼叫get_future()方法,返回與之關聯的future。
std::promise::get_future()
該方法返回乙個與promise物件共享狀態相關聯的future物件,返回的future物件,可以通過promise物件來訪問共享狀態的值或異常,每個promise物件共享狀態返回乙個future物件。
呼叫了此方法後,promise物件將在某一時刻(通過設定值或異常)使共享狀態準備就緒,否則,它將在自動析構包含future_error型別異常的情況下準備就緒。
std::promise::set_value()
設定共享狀態的值,若乙個future物件關聯了同一共享狀態,並且呼叫了future::get()來阻塞的獲取值時,經呼叫promise::set_value()後將不再阻塞並返回乙個值。
std::promise::set_value_at_thread_exit()
如果某個future物件與promise物件的共享狀態相關聯,並且該future物件正在呼叫get(),則會被阻塞,當執行緒退出時,不再阻塞並且返回共享狀態的值。
std::packaged_task()
包裝了乙個可呼叫的目標,並且允許非同步的獲取其結果。與std::function類似,但其結果將自動的傳遞給future物件(可以在另乙個執行緒中呼叫future::get()獲取該結果)。
我們來看乙個例子:
#include // std::cout
#include // std::packaged_task, std::future
#include // std::chrono::seconds
#include // std::thread, std::this_thread::sleep_for
using namespace std;
// 被包裝的函式:秒倒數計數
int countdown(int from, int to)
cout << "lift off!\n";
return from - to;
}int main()
packaged_task物件內部包含兩個元素:
1、被包裝的任務:如函式指標,指向成員或函式物件的指標;
2、儲存共享狀態:用於儲存任務的返回值,可以通過future::get()來非同步訪問共享狀態的值。
std::packaged_task::get_future()
我們來看一段**:
#include // std::cout
#include // std::move
#include // std::packaged_task, std::future
#include // std::thread
using namespace std;
int triple (int x)
int main ()
在上述**中,主線程與任務執行緒剝離,任務執行緒交由系統管理,主線程呼叫fut.get()將阻塞地等待任務執行緒計算完畢,才能獲取到共享狀態的值。
std::packaged_task::reset()
同樣的,我們來看一段**:
#include // std::cout
#include // std::move
#include // std::packaged_task, std::future
#include // std::thread
using namespace std;
int triple(int x)
int main()
重置任務:在保持同一包裝任務的同時,使用新的共享狀態來重置任務物件,這允許再次呼叫儲存任務。 《探索C 多執行緒》 future原始碼(一)
在此之前的幾篇文章分別介紹和分析了c 11.0標準庫中支援多執行緒的幾個標頭檔案 那麼接下來乘熱打鐵,在這篇文章中將要分析的是 多執行緒的非同步操作。多執行緒的非同步操作原始碼在標頭檔案中。我們先來看一看中都定義了些什麼類 函式 classes future future error package...
《探索C 多執行緒》 thread原始碼(二)
分析thread的內部類id 和 命名空間this thread。this thread中有四個函式,分別是 get id yield sleep for sleep until 它們的定義如下 namespace this thread thrd yield inline void sleep u...
c 多執行緒 原始碼3
在開發中經常會遇到執行緒的例子,如果某個後台操作比較費時間,我們就可以啟動乙個執行緒去執行那個費時的操作,同時程式繼續執行。在某些情況下可能會出現多個執行緒的同步協同的問題,下面的例子就展示了在兩個執行緒之間如何協同工作。這個程式的思路是共同做一件事情 從乙個arraylist中刪除元素 如果執行完...