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));

    // Правим друга работа, докато работникът работи
    std::cout << "Doing something else..." << std::endl;

    // Получаваме резултата (блокира, ако не е готов)
    int result = future_obj.get();
    std::cout << "Result from worker: " << result << std::endl;

    // Изчакваме завършването на работния поток
    worker_thread.join();

    return 0;
}

Важни методи на std::future:

Метод Описание
get() Получава резултата. Блокира, ако резултатът все още не е готов. Може да бъде извикан само веднъж.
valid() Проверява дали std::future е свързан с асинхронна операция.
wait() Блокира текущия поток, докато резултатът не стане достъпен (или не бъде хвърлено изключение).
wait_for() Изчаква резултата за зададения интервал от време. Връща статус на изчакване.
wait_until() Изчаква резултата до зададения момент от време. Връща статус на изчакване.

std::future е част от библиотеката <future> и предоставя удобен начин за управление на резултатите от асинхронни изчисления, улеснявайки разработката на многопоточни приложения.