Saya membingungkan diri sendiri dengan perbedaan antara masa depan dan janji.
Jelas, mereka memiliki metode dan barang yang berbeda, tetapi apa kasus penggunaan yang sebenarnya?
Apakah itu?:
- ketika saya mengelola beberapa tugas async, saya menggunakan masa depan untuk mendapatkan nilai "di masa depan"
- ketika saya tugas async, saya menggunakan janji sebagai tipe kembali untuk memungkinkan pengguna mendapatkan masa depan dari janji saya
Jawaban:
Masa Depan dan Janji adalah dua sisi terpisah dari operasi asinkron.
std::promise
digunakan oleh "produser / penulis" operasi asinkron.std::future
digunakan oleh "konsumen / pembaca" dari operasi asinkron.Alasan dipisahkan menjadi dua "antarmuka" yang terpisah ini adalah untuk menyembunyikan fungsi "tulis / set" dari "konsumen / pembaca".
Salah satu (tidak lengkap) cara untuk mengimplementasikan std :: async menggunakan std :: janji bisa menjadi:
Menggunakan
std::packaged_task
yang merupakan helper (yaitu pada dasarnya melakukan apa yang kami lakukan di atas) di sekitarstd::promise
Anda dapat melakukan hal berikut yang lebih lengkap dan mungkin lebih cepat:Perhatikan bahwa ini sedikit berbeda dari
std::async
tempat yang dikembalikanstd::future
akan ketika dihancurkan sebenarnya memblokir sampai utas selesai.sumber
std::move(something)
tidak berguna dan juga menyakitkan (N) RVO. Mengembalikan suntingannya.