Sobes.tech
Middle

C++ da std::future nima?

sobes.tech AI

AIdan javob

std::future — bu C++ daftarchasida shablon sinf bo‘lib, kelajakda mavjud bo‘ladigan (qiymat yoki istisno) asinxron operatsiyaning natijasini ifodalaydi. U alohida oqimda yoki std::async yordamida boshlatilgan vazifaning natijasini olish uchun ishlatiladi.

Asosiy xususiyatlar:

  • Asinxronlik: Joriy oqimni bloklamasdan operatsiya bajarishga imkon beradi.
  • Natijani olish: get() metodi operatsiya natijasini olish imkonini beradi. Agar natija hali tayyor bo‘lmasa, get() joriy oqimni tayyor bo‘lishigacha yoki istisno chiqarilguncha bloklaydi.
  • Ma’lumotlarni uzatish: std::promise obyekti bilan bog‘langan bo‘lib, natija yoki istisnoni o‘rnatish imkonini beradi.
  • Holat: std::future ning holati bor, bu natija tayyor yoki yo‘qligini ko‘rsatadi. Buni wait() yoki wait_for() yordamida tekshirish mumkin.
  • Faqat bir marta olish: get() metodi har bir std::future obyekti uchun faqat bir marta chaqirilishi mumkin.
  • Natija turi: Asinxron operatsiyaning qaytariladigan qiymat turi bilan belgilangan.

std::async bilan misol:

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

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

// `std::async` bilan `std::future` dan foydalanish misoli
int main() {
    // Asinxron operatsiya boshlash
    std::future<int> result_future = std::async(std::launch::async, calculate_something);

    // Boshqa ishni bajarish, operatsiya hisoblanayotgan paytda
    std::cout << "Boshqa narsa qilmoqda..." << std::endl;

    // Natijani olish (bloklanadi, agar tayyor bo‘lmasa)
    int result = result_future.get();
    std::cout << "Natija: " << result << std::endl;

    return 0;
}

std::promise bilan misol:

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

void worker_function(std::promise<int> promise_obj) {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    // Natijani o‘rnatish
    promise_obj.set_value(123);
}

// `std::promise` bilan `std::future` dan foydalanish misoli
int main() {
    // Promise va future yaratish
    std::promise<int> promise_obj;
    std::future<int> future_obj = promise_obj.get_future();

    // Worker ni alohida oqimda ishga tushirish, promise ni uzatish
    std::thread worker_thread(worker_function, std::move(promise_obj));

    // Boshqa ishni bajarish, worker ishlayotgan paytda
    std::cout << "Boshqa narsa qilmoqda..." << std::endl;

    // Natijani olish (bloklanadi, agar tayyor bo‘lmasa)
    int result = future_obj.get();
    std::cout << "Worker natijasi: " << result << std::endl;

    // Worker oqimini kutish
    worker_thread.join();

    return 0;
}

std::future ning muhim metodlari:

Metod Tavsifi
get() Natijani oladi. Agar tayyor bo‘lmasa, bloklaydi. Har bir std::future uchun faqat bir marta chaqiriladi.
valid() std::future ning asinxron operatsiya bilan bog‘langan yoki yo‘qligini tekshiradi.
wait() Natija tayyor bo‘lishini kutadi, yoki istisno chiqarilishini kutadi.
wait_for() Belgilangan vaqt oralig‘ida natijani kutadi. Kutish holatini qaytaradi.
wait_until() Belgilangan vaqtgacha natijani kutadi. Kutish holatini qaytaradi.

std::future <future> kutubxonasining bir qismidir va asinxron hisoblash natijalarini boshqarish uchun qulay usul taqdim etadi, ko‘p oqimli dasturlarni rivojlantirishni soddalashtiradi.