Sobes.tech
Middle

C++'ta std::future nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

std::future — C++ dilinde, asenkron bir işlemin sonucu (değer veya istisna) temsil eden şablon sınıfıdır ve gelecekte erişilebilir olacaktır. Ayrı bir thread veya std::async aracılığıyla başlatılan görevin sonucunu almak için kullanılır.

Ana özellikler:

  • Asenkronluk: Mevcut thread’i engellemeden bir işlem gerçekleştirmeye olanak tanır.
  • Sonucu alma: get() yöntemi, işlemin sonucunu alır. Sonuç henüz hazır değilse, get() mevcut thread’i sonuç hazır olana kadar veya bir istisna alınana kadar engeller.
  • Veri iletimi: std::promise nesnesiyle ilişkilidir ve sonucu veya istisnayı ayarlama imkanı sağlar.
  • Durum: std::future’ın, sonucun hazır olup olmadığını gösteren bir durumu vardır. wait() veya wait_for() ile kontrol edilebilir.
  • Tek seferlik alma: get() yöntemi, her std::future nesnesi için yalnızca bir kez çağrılabilir.
  • Sonuç tipi: Asenkron işlemin döndürdüğü değer türüyle belirlenir.

std::async ile kullanım örneği:

#include <future>
#include <thread>
#include <chrono>
#include <iostream>

int calculate_something() {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    return 42;
}

// `std::async` ile `std::future` kullanımı örneği
int main() {
    // Asenkron işlemi başlat
    std::future<int> result_future = std::async(std::launch::async, calculate_something);

    // İşlem hesaplanırken başka bir iş yap
    std::cout << "Başka bir şey yapılıyor..." << std::endl;

    // Sonucu al (hazır değilse engeller)
    int result = result_future.get();
    std::cout << "Sonuç: " << result << std::endl;

    return 0;
}

std::promise ile kullanım örneği:

#include <future>
#include <thread>
#include <iostream>

void worker_function(std::promise<int> promise_obj) {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    // Sonucu ayarla
    promise_obj.set_value(123);
}

// `std::promise` ile `std::future` kullanımı örneği
int main() {
    // Promise ve future oluştur
    std::promise<int> promise_obj;
    std::future<int> future_obj = promise_obj.get_future();

    // Bir thread’de worker başlat, promise’yi geçir
    std::thread worker_thread(worker_function, std::move(promise_obj));

    // Worker çalışırken başka bir iş yap
    std::cout << "Başka bir şey yapılıyor..." << std::endl;

    // Sonucu al (hazır değilse engeller)
    int result = future_obj.get();
    std::cout << "Worker’dan gelen sonuç: " << result << std::endl;

    // Worker thread’in bitmesini bekle
    worker_thread.join();

    return 0;
}

std::future’ın önemli metodları:

Metod Açıklama
get() Sonucu alır. Henüz hazır değilse engeller. Her nesne için yalnızca bir kez çağrılabilir.
valid() std::future’ın bir asenkron işlemle ilişkili olup olmadığını kontrol eder.
wait() Sonuç erişilebilir olana kadar mevcut thread’i engeller (veya istisna atılır).
wait_for() Belirtilen zaman aralığında sonucu bekler. Bekleme durumunu döner.
wait_until() Belirli bir zaman noktasına kadar sonucu bekler. Bekleme durumunu döner.

std::future, <future> kütüphanesinin bir parçasıdır ve asenkron hesaplamaların sonuçlarını yönetmek için kullanışlı bir yol sağlar, çoklu thread uygulamalarının geliştirilmesini kolaylaştırır.