Middle
std::future дар C++ чист?
sobes.tech AI
Ҷавоб аз AI
std::future — инҷо як синфи шаблонӣ дар C++ мебошад, ки натиҷа (қимат ё истисно) аз амалиёти асинхрониро намояндагӣ мекунад, ки дар оянда дастрас хоҳад шуд. Он барои гирифтани натиҷаи иҷрои вазифае, ки дар як ҷараёни алоҳида ё тавассути std::async оғоз шудааст, истифода мешавад.
Хусусиятҳои асосӣ:
- Асинхронӣ: Имкон медиҳад, ки амалиётро бидуни бастани ҷараёни ҳозира иҷро кунад.
- Гирифтани натиҷа: Метод
get()имкон медиҳад, ки натиҷаро ба даст орад. Агар натиҷа ҳоло ҳам тайёр набошад,get()ҷараёни ҳозираро то он дам блок мекунад, ки он дастрас шавад ё истисно бардошта шавад. - Пас додани маълумот: Бо объекти
std::promiseпайваст аст, ки роҳи гузоштани натиҷа ё истисноро медиҳад. - Ҳолат:
std::futureдорои ҳолатест, ки нишон медиҳад, натиҷа тайёр аст ё не. Инро боwait()ёwait_for()санҷидан мумкин аст. - Танҳо як маротиба: Метод
get()метавонад танҳо як маротиба барои ҳар объектиstd::futureдаъват шавад. - Намуди натиҷа: Тасниф мешавад бо намуди баргардонидашавандаи амалиёти асинхронӣ.
Масали истифода бо std::async:
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int calculate_something() {
std::this_thread::sleep_for(std::chrono::seconds(1));
return 42;
}
// Масали истифодаи `std::future` бо `std::async`
int main() {
// Идора кардани амалиёти асинхронӣ
std::future<int> result_future = std::async(std::launch::async, calculate_something);
// Иҷрои кори дигар дар ҳоле ки амалиёт ҳисоб мешавад
std::cout << "Doing something else..." << std::endl;
// Гирифтани натиҷа (мебандад агар тайёр набошад)
int result = result_future.get();
std::cout << "Result is: " << result << std::endl;
return 0;
}
Масали истифода бо std::promise:
#include <future>
#include <thread>
#include <iostream>
void worker_function(std::promise<int> promise_obj) {
std::this_thread::sleep_for(std::chrono::seconds(1));
// Гузоштани натиҷа
promise_obj.set_value(123);
}
// Масали истифодаи `std::future` бо `std::promise`
int main() {
// Таҳия кардани promise ва future
std::promise<int> promise_obj;
std::future<int> future_obj = promise_obj.get_future();
// Идора кардани worker дар ҷараёни алоҳида, бо гузоштани promise
std::thread worker_thread(worker_function, std::move(promise_obj));
// Иҷрои кори дигар дар ҳоле ки worker кор мекунад
std::cout << "Doing something else..." << std::endl;
// Гирифтани натиҷа (мебандад агар тайёр набошад)
int result = future_obj.get();
std::cout << "Result from worker: " << result << std::endl;
// Чекор кардани анҷоми ҷараёни worker
worker_thread.join();
return 0;
}
Меҳодҳои муҳим барои std::future:
| Метод | Тавсиф |
|---|---|
get() |
Натиҷаро мегирад. Агар он ҳоло ҳам тайёр набошад, мебандад. Мебандад танҳо як маротиба. |
valid() |
Санҷиш мекунад, ки оё std::future бо ҳолати амалиёт пайваст аст ё не. |
wait() |
Ҷараёни ҳозираро то он даме, ки натиҷа дастрас шавад (ё истисно) мебандад. |
wait_for() |
Дар давоми вақти муайян натиҷаро интизор мешавад. Статусро бармегардонад. |
wait_until() |
То вақти муайян натиҷаро интизор мешавад. Статусро бармегардонад. |
std::future қисми китобхонаи <future> аст ва роҳи қулай барои идора кардани натиҷаҳои ҳисобҳои асинхронӣ пешниҳод мекунад, ки рушди барномаҳои бисёртредиро осон мекунад.