《探索C 多執行緒》 future原始碼(二)

2021-07-31 18:17:37 字數 2599 閱讀 8162

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中刪除元素 如果執行完...