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::promiseobyekti bilan bog‘langan bo‘lib, natija yoki istisnoni o‘rnatish imkonini beradi. - Holat:
std::futurening holati bor, bu natija tayyor yoki yo‘qligini ko‘rsatadi. Buniwait()yokiwait_for()yordamida tekshirish mumkin. - Faqat bir marta olish:
get()metodi har birstd::futureobyekti 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.