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();
// სამუშაოს გამოძახება ცალკე ნაკადში, `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> ბიბლიოთეკის და უზრუნველყოფს კომფორტულ გზას ასინქრონული გამოთვლების შედეგების მართვისთვის, რაც ამარტივებს მრავალთრედული პროგრამების შემუშავებას.