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

    // Εκτελούμε άλλη εργασία ενώ ο 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> και παρέχει έναν εύχρηστο τρόπο διαχείρισης αποτελεσμάτων ασύγχρονων υπολογισμών, απλοποιώντας την ανάπτυξη πολυνηματικών εφαρμογών.