Sobes.tech
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> аст ва роҳи қулай барои идора кардани натиҷаҳои ҳисобҳои асинхронӣ пешниҳод мекунад, ки рушди барномаҳои бисёртредиро осон мекунад.