Sobes.tech
Middle

C++та std::future эмне?

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тин маанилүү методдору:

Метод Description
get() Натыйжаны алат. Эгер даяр эмес болсо, тоскоолдуксуз күтөт. Ар бир std::future объектисинде бир жолу гана колдонулушу мүмкүн.
valid() std::future асинхрондук операциянын жалпы абалына байланыштуу экенин текшерет.
wait() Актуалдуу агымды тоскоолдуксуз күтөт, натыйжа жеткиликтүү болгондо же исключение чыкканда токтойт.
wait_for() Белгиленген убакыт аралыгында натыйжаны күтөт. Күтүүнүн абалын кайтарат.
wait_until() Белгиленген убакыт чекитине чейин натыйжаны күтөт. Күтүүнүн абалын кайтарат.

std::future <future> китепканасынын бөлүгү болуп саналат жана асинхрондуу эсептөөлөрдүн натыйжаларын башкарууну ыңгайлуу кылат, көп агымдуу тиркемелерди түзүүдө жеңилдик берет.