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

    // Աշխատանքի գործարկում առանձին հոսքում, փոխանցելով `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> գրադարանի և տրամադրում է հարմար միջոց ասինխրոնային հաշվարկների արդյունքների կառավարելու համար, հեշտացնելով բազմահոսքային ծրագրերի մշակում։