Fungsi <future>
async
future_category
make_error_code
make_error_condition
swap
|
async
Mewakili penyedia asinkron.
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);
Parameter
policy
Nilai launch
.
Keterangan
Definisi singkatan:
Singkatan | Deskripsi |
---|---|
dfn |
Hasil panggilan decay_copy(forward<Fn>(fn)) . |
dargs |
Hasil panggilan decay_copy(forward<ArgsTypes>(args...)) . |
Ty |
Jenis result_of<Fn(ArgTypes...)>::type . |
Fungsi templat pertama mengembalikan async(launch::any, fn, args...)
.
Fungsi kedua mengembalikan objek yang status asinkron terkaitnya menyimpan hasil bersama dengan nilai dfn
dan dargs
dan objek utas future<Ty>
untuk mengelola utas eksekusi terpisah.
Kecuali decay<Fn>::type
merupakan jenis selain peluncuran, fungsi kedua tidak berpartisipasi dalam resolusi kelebihan beban.
Standar C++ menyatakan bahwa jika kebijakan adalah launch::async
, fungsi berperilaku seolah-olah memanggil objek yang dapat dipanggil di utas baru. Ini berarti bahwa meskipun biasanya menghasilkan pembuatan utas baru, implementasinya dapat menggunakan mekanisme lain untuk mencapai perilaku yang setara. Namun, implementasi Microsoft saat ini tidak sesuai secara ketat dengan perilaku ini. Ini mendapatkan utas dari Windows ThreadPool, yang dapat menyediakan utas daur ulang daripada yang baru. Ini berarti bahwa launch::async
kebijakan diterapkan secara efektif sebagai launch::async|launch::deferred
. Implikasi lain dari implementasi berbasis ThreadPool adalah bahwa tidak ada jaminan bahwa variabel thread-local dihancurkan ketika utas selesai. Jika utas didaur ulang dan disediakan untuk panggilan baru ke async
, variabel lama masih ada. Kami menyarankan agar Anda menghindari penggunaan variabel thread-local dengan async
.
Jika policy
adalah launch::deferred
, fungsi menandai status asinkron terkait sebagai menahan fungsi yang ditangguhkan dan mengembalikan. Panggilan pertama ke fungsi non-waktu yang menunggu status asinkron terkait siap berlaku memanggil fungsi yang ditangguhkan dengan mengevaluasi INVOKE(dfn, dargs..., Ty)
.
Dalam semua kasus, status asinkron terkait dari future
objek tidak diatur ke siap sampai evaluasi INVOKE(dfn, dargs..., Ty)
selesai, baik dengan melempar pengecualian atau dengan kembali secara normal. Hasil dari status asinkron terkait adalah pengecualian jika satu dilemparkan, atau nilai yang dikembalikan evaluasi.
Catatan
Untuk — future
atau yang terakhir shared_future
—yang dilampirkan ke tugas yang dimulai dengan std::async
, destruktor memblokir jika tugas belum selesai; artinya, ia memblokir jika utas ini belum memanggil .get()
atau .wait()
dan tugas masih berjalan. Jika diperoleh future
dari std::async
dipindahkan ke luar cakupan lokal, kode lain yang menggunakannya harus menyadari bahwa destruktornya dapat memblokir status bersama agar siap.
Fungsi pseudo INVOKE
didefinisikan dalam <functional>
.
Khusus Microsoft
Ketika fungsi yang diteruskan dijalankan secara asinkron, fungsi dijalankan pada Kumpulan Utas Windows. Untuk informasi selengkapnya, lihat Kumpulan Utas. Jumlah utas bersamaan terbatas pada default kumpulan utas, yaitu 500 utas.
Sebelum Windows 11 dan Windows Server 2022, aplikasi dibatasi secara default ke satu grup prosesor yang memiliki paling banyak 64 prosesor logis. Ini membatasi jumlah utas yang dieksekusi secara bersamaan menjadi 64. Untuk informasi selengkapnya, lihat Grup Prosesor.
Dimulai dengan Windows 11 dan Windows Server 2022, proses dan utasnya memiliki afinitas prosesor yang secara default mencakup semua prosesor dalam sistem dan di beberapa grup pada komputer dengan lebih dari 64 prosesor. Batas jumlah utas bersamaan sekarang adalah jumlah total prosesor logis dalam sistem.
future_category
Mengembalikan referensi ke error_category
objek yang mencirikan kesalahan yang terkait dengan future
objek.
const error_category& future_category() noexcept;
make_error_code
Membuat error_code bersama dengan objek error_category yang mencirikan kesalahan di masa mendatang.
inline error_code make_error_code(future_errc Errno) noexcept;
Parameter
Errno
Nilai future_errc
yang mengidentifikasi kesalahan yang dilaporkan.
Tampilkan Nilai
error_code(static_cast<int>(Errno), future_category());
make_error_condition
Membuat bersama error_condition
dengan error_category
objek yang mencirikan future
kesalahan.
inline error_condition make_error_condition(future_errc Errno) noexcept;
Parameter
Errno
Nilai future_errc
yang mengidentifikasi kesalahan yang dilaporkan.
Tampilkan Nilai
error_condition(static_cast<int>(Errno), future_category());
swap
Menukar status asinkron terkait dari satu promise
objek dengan objek lainnya.
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;
Parameter
Left
Objek kiri promise
.
Right
Objek yang tepat promise
.