<future>
函式
async
future_category
make_error_code
make_error_condition
swap
|
async
代表「非同步提供者」。
template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
async(Fn&& fn, ArgTypes&&... args);
template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
async(launch policy, Fn&& fn, ArgTypes&&... args);
參數
policy
launch
值。
備註
縮寫的定義:
縮寫 | 描述 |
---|---|
dfn |
呼叫 decay_copy(forward<Fn>(fn)) 的結果。 |
dargs |
呼叫 decay_copy(forward<ArgsTypes>(args...)) 的結果。 |
Ty |
result_of<Fn(ArgTypes...)>::type 類型。 |
第一個範本函式會傳回 async(launch::any, fn, args...)
。
第二個future<Ty>
函式會傳回物件,其相關聯的異步狀態會與的值和 dargs
線程物件一dfn
起保存結果,以管理個別的執行線程。
除非 decay<Fn>::type
是launch以外的類型,否則第二個函式不會參與多載解析。
C++標準指出,如果原則為 launch::async
,函式的行為就如同在新的線程中叫用可呼叫的對象一樣。 這表示雖然它通常會導致建立新的線程,但實作可能會使用其他機制來達到對等的行為。 不過,Microsoft實作目前不符合此行為。 它會從 Windows ThreadPool 取得線程,這可能會提供回收線程,而不是新的線程。 這表示原則 launch::async
實際上會實作為 launch::async|launch::deferred
。 ThreadPool 型實作的另一個含意是,不保證線程區域變數在線程完成時會終結。 如果線程已回收並提供給新的呼叫 async
,則舊的變數仍然存在。 建議您避免搭配 async
使用線程局部變數。
如果 policy
是 launch::deferred
,此函式就會將其相關非同步狀態標示為持有「deferred 函式」並返回。 第一次呼叫任何等待相關聯異步狀態就緒的非定時函式,會藉由評估 INVOKE(dfn, dargs..., Ty)
來呼叫延後函式。
在所有情況下,在評估INVOKE(dfn, dargs..., Ty)
完成之前,對象相關聯的異步狀態future
不會設定為就緒,無論是擲回例外狀況還是正常傳回。 如果擲回了異步狀態,或評估傳回的值,則關聯的異步狀態結果是例外狀況。
注意
對於附加至以 開頭std::async
之工作的最後shared_future
一future
個 ,解構函式會在工作尚未完成時封鎖;也就是說,如果此線程尚未呼叫 .get()
或.wait()
,則會封鎖工作仍在執行中。 如果將從 std::async
取得的 future
移到區域範圍外,其他使用它的程式碼必須知悉其解構函式可能進行封鎖來讓共用狀態變成就緒。
虛擬函 INVOKE
式定義於 中 <functional>
。
Microsoft 特定的
以異步方式執行傳遞的函式時,它會在 Windows 線程集區上執行。 如需詳細資訊,請參閱 線程集區。 並行線程數目受限於線程集區預設值,也就是 500 個線程。
在 Windows 11 和 Windows Server 2022 之前,應用程式預設受限於最多具有 64 個邏輯處理器的單一處理器群組。 這會將同時執行的線程數目限制為 64。 如需詳細資訊,請參閱 處理器群組。
從 Windows 11 和 Windows Server 2022 開始,進程及其線程具有處理器親和性,依預設會跨越系統中的所有處理器,以及具有 64 個處理器的計算機上多個群組。 並行線程數目的限制現在是系統中邏輯處理器總數。
future_category
傳回對 error_category
物件的參考,此物件會描述 future
物件之相關錯誤的特性。
const error_category& future_category() noexcept;
make_error_code
建立 error_code 連同描述 future 錯誤特性的 error_category 物件。
inline error_code make_error_code(future_errc Errno) noexcept;
參數
Errno
future_errc
值,識別回報的錯誤。
傳回值
error_code(static_cast<int>(Errno), future_category());
make_error_condition
error_condition
與error_category
描述future
錯誤的物件一起建立 。
inline error_condition make_error_condition(future_errc Errno) noexcept;
參數
Errno
future_errc
值,識別回報的錯誤。
傳回值
error_condition(static_cast<int>(Errno), future_category());
swap
將一個 promise
物件的「相關非同步狀態」與另一個物件的該狀態交換。
template <class Ty>
void swap(promise<Ty>& Left, promise<Ty>& Right) noexcept;
template <class Ty, class... ArgTypes>
void swap(packaged_task<Ty(ArgTypes...)>& Left, packaged_task<Ty(ArgTypes...)>& Right) noexcept;
參數
Left
左 promise
物件。
Right
右 promise
物件。