Sobes.tech
Middle

C++-də std::future nədir?

sobes.tech Süni İntellekt

AI-dan cavab

std::future — bu C++-də şablon sinifdir və asinxron əməliyyatın nəticəsini (dəyər və ya istisna) təmsil edir və gələcəkdə əlçatan olacaq. Bu, müstəqil bir axın və ya std::async vasitəsilə başlatılan tapşırığın nəticəsini almaq üçün istifadə olunur.

Əsas xüsusiyyətlər:

  • Asinxronluq: Cari axını bloklamadan əməliyyatı yerinə yetirməyə imkan verir.
  • Nəticənin alınması: get() metodu əməliyyatın nəticəsini əldə etməyə imkan verir. Əgər nəticə hələ hazır deyilsə, get() cari axını onun hazır olmasına və ya istisna alınmasına qədər bloklayacaq.
  • Məlumatların ötürülməsi: std::promise obyektinə bağlanır və nəticəni və ya istisnanı qurmağı təmin edir.
  • Vəziyyət: std::future nəticənin hazır olub-olmadığını göstərən vəziyyətə malikdir. wait() və ya wait_for() ilə yoxlamaq olar.
  • Yalnız bir dəfə əldə etmə: get() metodu hər std::future obyekti üçün yalnız bir dəfə çağırıla bilər.
  • Nəticə tipi: Asinxron əməliyyatın qaytardığı dəyər tipi ilə tiplənir.

std::async ilə istifadə nümunəsi:

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

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

// `std::async` ilə `std::future` nümunəsi
int main() {
    // Asinxron əməliyyatı başlatırıq
    std::future<int> result_future = std::async(std::launch::async, calculate_something);

    // Əməliyyat hesablanarkən başqa iş görürük
    std::cout << "Doing something else..." << std::endl;

    // Nəticəni alırıq (bloklama, əgər hazır deyilsə)
    int result = result_future.get();
    std::cout << "Result is: " << result << std::endl;

    return 0;
}

std::promise ilə istifadə nümunəsi:

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

void worker_function(std::promise<int> promise_obj) {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    // Nəticəni qururuq
    promise_obj.set_value(123);
}

// `std::promise` və `std::future` ilə nümunə
int main() {
    // Promise və future yaradırıq
    std::promise<int> promise_obj;
    std::future<int> future_obj = promise_obj.get_future();

    // İşçi funksiyasını müstəqil axında işə salırıq, promise ötürürük
    std::thread worker_thread(worker_function, std::move(promise_obj));

    // İşçi işləyərkən başqa iş görürük
    std::cout << "Doing something else..." << std::endl;

    // Nəticəni alırıq (bloklama, əgər hazır deyilsə)
    int result = future_obj.get();
    std::cout << "Result from worker: " << result << std::endl;

    // İşçi axını gözləyirik
    worker_thread.join();

    return 0;
}

std::future-in əsas metodları:

Metod Təsviri
get() Nəticəni alır. Əgər nəticə hələ hazır deyilsə, bloklayır. Hər std::future üçün yalnız bir dəfə çağırıla bilər.
valid() std::future-in ümumi asinxron əməliyyat vəziyyəti ilə əlaqəli olub-olmadığını yoxlayır.
wait() Cari axını, nəticə əlçatan olana qədər və ya istisna atılana qədər bloklayır.
wait_for() Verilən zaman intervalında nəticəni gözləyir. Gözləmə vəziyyətini geri qaytarır.
wait_until() Verilən vaxt nöqtəsinə qədər nəticəni gözləyir. Gözləmə vəziyyətini geri qaytarır.

std::future <future> kitabxanasının bir hissəsidir və asinxron hesablamaların nəticələrini idarə etmək üçün rahat yol təqdim edir, çox axınlı tətbiqlərin inkişafını sadələşdirir.