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> китепканасынын бөлүгү болуп саналат жана асинхрондуу эсептөөлөрдүн натыйжаларын башкарууну ыңгайлуу кылат, көп агымдуу тиркемелерди түзүүдө жеңилдик берет.