packaged_task 類別
描述「非同步提供者」,它是呼叫簽章為 Ty(ArgTypes...)
的呼叫包裝函式。 除了可能的結果外,它的「相關聯非同步狀態」會保存其可呼叫物件的複本。
語法
template <class>
class packaged_task;
成員
公用建構函式
名稱 | 描述 |
---|---|
packaged_task | 建構 packaged_task 物件。 |
packaged_task::~packaged_task 解構函式 | 終結 packaged_task 物件。 |
公用方法
名稱 | 描述 |
---|---|
get_future | 傳回 future 物件,該物件具有相同的相關聯非同步狀態。 |
make_ready_at_thread_exit | 呼叫儲存在「相關聯非同步狀態」中的可呼叫物件,並以不可部分完成的方式儲存傳回的值。 |
reset | 取代相關聯的非同步狀態。 |
swap | 使用指定的物件交換相關聯的異步狀態。 |
有效 | 指定物件是否具有「相關聯的非同步狀態」。 |
公用運算子
名稱 | 描述 |
---|---|
packaged_task::operator= | 從指定的物件轉移「相關聯的非同步狀態」。 |
packaged_task::operator() | 呼叫儲存在相關聯非同步狀態中的可呼叫物件,以不可部分完成的方式儲存傳回的值,並將狀態設定為「就緒」。 |
packaged_task::operator bool | 指定物件是否具有「相關聯的非同步狀態」。 |
需求
標頭:<future>
命名空間:std
packaged_task::get_future
傳回類型 future<Ty>
的物件,該物件具有相同的「相關聯非同步狀態」。
future<Ty> get_future();
備註
如果 packaged_task
物件沒有相關聯的非同步狀態,則這個方法會擲回含有 no_state
錯誤碼的 future_error。
如果已經針對具有同一個相關聯的非同步狀態的 packaged_task
物件呼叫這個方法,方法會擲回具有錯誤碼 future_already_retrieved
的 future_error
。
packaged_task::make_ready_at_thread_exit
呼叫儲存在「相關聯非同步狀態」中的可呼叫物件,並以不可部分完成的方式儲存傳回的值。
void make_ready_at_thread_exit(ArgTypes... args);
備註
如果 packaged_task
物件沒有相關聯的非同步狀態,則這個方法會擲回含有 no_state
錯誤碼的 future_error。
如果已經針對具有同一個相關聯的非同步狀態的 packaged_task
物件呼叫這個方法或 make_ready_at_thread_exit,方法會擲回具有錯誤碼 promise_already_satisfied
的 future_error
。
否則,此運算子會呼叫 INVOKE(fn, args..., Ty)
,其中 fn 是儲存在相關聯非同步狀態中的可呼叫物件。 任何傳回的值會以不可部分完成的方式儲存為相關聯非同步狀態的傳回結果。
與 packaged_task::operator()相反地,在呼叫線程中的所有線程區域對象終結之後,才會將相關聯的異步狀態設定ready
為 。 一般而言,在呼叫線程結束時,在相關聯的異步狀態上封鎖的線程不會解除封鎖。
packaged_task::operator=
從指定的物件轉移「相關聯的非同步狀態」。
packaged_task& operator=(packaged_task&& Right);
參數
Right
packaged_task
物件。
傳回值
*this
備註
作業之後, Right 不再具有相關聯的異步狀態。
packaged_task::operator()
呼叫儲存在「相關聯非同步狀態」中的可呼叫物件,以不可部分完成的方式儲存傳回的值,並將狀態設定為「就緒」。
void operator()(ArgTypes... args);
備註
如果 packaged_task
物件沒有相關聯的非同步狀態,則這個方法會擲回含有 no_state
錯誤碼的 future_error。
如果已經針對具有同一個相關聯的非同步狀態的 packaged_task
物件呼叫這個方法或 make_ready_at_thread_exit,方法會擲回具有錯誤碼 promise_already_satisfied
的 future_error
。
否則,此運算子會呼叫 INVOKE(fn, args..., Ty)
,其中 fn 是儲存在相關聯非同步狀態中的可呼叫物件。 任何傳回的值會以不可部分完成的方式儲存為相關聯非同步狀態的傳回結果,並將狀態設為就緒。 如此一來,封鎖於相關聯非同步狀態上的所有執行緒都會解除封鎖。
packaged_task::operator bool
指定物件是否具有 associated asynchronous state
。
operator bool() const noexcept;
傳回值
如果物件有關聯的非同步狀態,就是 true
,否則為 false
。
packaged_task::packaged_task 建構函式
建構 packaged_task
物件。
packaged_task() noexcept;
packaged_task(packaged_task&& Right) noexcept;
template <class Fn>
explicit packaged_task(Fn&& fn);
template <class Fn, class Alloc>
explicit packaged_task(
allocator_arg_t, const Alloc& alloc, Fn&& fn);
參數
Right
packaged_task
物件。
alloc
記憶體配置器。 如需詳細資訊,請參閱配置器>。<
fn
函式物件。
備註
第一個建構函式會建構不具有「相關聯非同步狀態」的 packaged_task
物件。
第二個packaged_task
建構函式會建構 物件,並從 Right 傳輸相關聯的異步狀態。 作業之後, Right 不再具有相關聯的異步狀態。
第三個packaged_task
建構函式會建構物件,該物件具有儲存在其相關聯異步狀態中的 fn 複本。
第四個packaged_task
建構函式會建構物件,該物件具有儲存在其相關聯異步狀態中的 fn 複本,並用於alloc
記憶體配置。
packaged_task::~packaged_task 解構函式
終結 packaged_task
物件。
~packaged_task();
備註
如果相關聯的異步狀態尚未就緒,解構函式會儲存future_error例外狀況,其錯誤碼會因為相關聯的異步狀態而造成錯誤碼broken_promise
,而相關聯異步狀態上封鎖的任何線程會解除封鎖。
packaged_task::reset
使用新的「相關聯非同步狀態」來取代現有的相關聯非同步狀態。
void reset();
備註
實際上,這個方法會執行 *this = packaged_task(move(fn))
,其中 fn 是儲存於此物件之相關聯非同步狀態中的函式物件。 因此,物件的狀態會清除, get_future、 operator()和 make_ready_at_thread_exit 可以如同在新建構的物件上呼叫。
packaged_task::swap
使用指定的物件交換相關聯的異步狀態。
void swap(packaged_task& Right) noexcept;
參數
Right
packaged_task
物件。
packaged_task::valid
指定物件是否具有 associated asynchronous state
。
bool valid() const;
傳回值
如果物件有關聯的非同步狀態,就是 true
,否則為 false
。