std::future
- C++ kursu
- İleri seviye
- Ders 23/83
- 5 dk
std::future ve promise ile değer aktarımı öğrenirsin.
std::future
std::future<T>, henüz hesaplanmamış bir T sonucunu taşır. std::async veya std::promise ile oluşturulur. f.get() çağrıldığında sonuç hazır olana kadar bekler ve değeri döndürür.
get yalnızca bir kez çağrılabilir; ikinci çağrıda std::future_error fırlatılır. valid() ile future'ın hâlâ sonucu tutup tutmadığı kontrol edilir. wait() sonucu almadan yalnızca bekler; wait_for ve wait_until zaman aşımı verir. future, tek okuma senkronizasyonu için ideal bir araçtır.
promise ve future ilişkisi
std::promise<T>, sonucu ayarlayan taraf; std::future<T> sonucu okuyan taraftır. Bir promise'den p.get_future() ile future alınır; p.set_value(v) ile değer yazılır. Bu, eldeki veriyi başka bir iş parçacığına aktarmanın düşük seviyeli yoludur.
std::async bu ilişkiyi otomatik kurar; kullanıcı promise ve future'u doğrudan ele almaz. Ancak özel senkronizasyon gerektiğinde promise/future çifti manuel kullanılır. Bu, üretici-tüketici (producer-consumer) kalıbının temelidir. Her promise bir future ile eşleştirilir; birebir ilişki vardır.
Uygulama future ile sonuç al
int compute() yaz; gövdede return 100; olsun. main içinde std::future<int> f = std::async(std::launch::async, compute); yaz, sonra int result = f.get(); ile sonucu al ve std::cout << result; yaz.
Başlangıç kodu
#include <iostream>
#include <future>
// compute fonksiyonunu yaz
int main() {
// future başlat, sonucu al ve yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <future>
int compute() {
return 100;
}
int main() {
std::future<int> f = std::async(std::launch::async, compute);
int result = f.get();
std::cout << result;
return 0;
}Beklenen çıktı
100
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 get satırını tamamla
std::future<int> f = std::async(std::launch::async, compute);
int r = ____;
std::future<int> f = std::async(std::launch::async, compute);
int r = f.get();
Açıklama: f.get() sonucu bekler ve döndürür.
2 future::get() ne yapar?
- Sonucu siler
- Yalnızca bekler
- Sonucu bekler ve döndürür Doğru cevap
- İş parçacığını başlatır
Açıklama: get() sonucu hazır olana kadar bekler ve değeri döndürür.
3 İfadeyi rolüne eşle
| Kavram | Anlamı |
|---|---|
f.get() |
Sonucu al |
f.wait() |
Sadece bekle |
f.valid() |
Geçerli mi? |
p.set_value(v) |
Değeri yaz |