Πώς να εφαρμόσετε το Multithreading στη C++

Pos Na Epharmosete To Multithreading Ste C



Το Multithreading στη C++ είναι μια δυνατότητα που επιτρέπει σε κάποιον να εκτελεί πολλές εργασίες ταυτόχρονα ταυτόχρονα. Ένα νήμα είναι η μονάδα εργασίας μιας συγκεκριμένης διαδικασίας που εκτελείται. Πολυάριθμα νήματα εκτελούνται ανεξάρτητα το ένα από το άλλο ταυτόχρονα για να εκτελούν πολυνηματοποίηση.

Πώς να εφαρμόσετε το Multithreading στη C++

Ένα πρόγραμμα πολλαπλών νημάτων έχει δύο ή περισσότερα μέρη που έχουν την τάση να εκτελούνται ταυτόχρονα, κάθε τμήμα είναι γνωστό ως νήμα και έχει διαφορετική διαδρομή για εκτέλεση. Πολυάριθμα νήματα εκτελούνται ανεξάρτητα το ένα από το άλλο ταυτόχρονα για να εκτελούν πολυνηματοποίηση.







Προαπαιτούμενα για Multithreading σε C++

Στα Windows, οι λειτουργίες που σχετίζονται με τα νήματα μπορούν να εκτελεστούν σε C++ 11 και σε προηγμένες εκδόσεις. Κατά τη χρήση του μεταγλωττιστή Dev-C++, από προεπιλογή βρίσκεται στην έκδοση C++ 3, επομένως πρέπει να αλλάξει χειροκίνητα στην έκδοση C++ 11. Το περιβάλλον GNU C++11 μπορεί να επιλεγεί αλλάζοντας τις τυπικές ρυθμίσεις γλώσσας.



Ανοίξτε τον μεταγλωττιστή Dev-C++ και μεταβείτε στα 'Εργαλεία' στη γραμμή εργασιών. Επιλέξτε 'Επιλογές μεταγλώττισης' και, στη συνέχεια, επιλέξτε 'Ρυθμίσεις', κάντε κλικ στο μπλοκ 'Δημιουργία κώδικα' θα εμφανιστεί μια λίστα με τις εντολές. Επιλέξτε GNU C++11 από το 'Language Standard(-std)' και μετά κάντε κλικ στο OK. Τώρα αυτός ο μεταγλωττιστής είναι έτοιμος να υποστηρίζει λειτουργίες νήματος.




Κατεβάστε τις βιβλιοθήκες από το GitHub και τοποθετήστε τα στο φάκελο lib του μεταγλωττιστή Cpp. Καλέστε αυτές τις βιβλιοθήκες στο πρόγραμμα χρησιμοποιώντας αρχεία κεφαλίδας #include 'mingw.thread.h' και , παρακάτω είναι η σύνταξή του:





std::thread thread_object ( κλητός ) ;


Το std::thread υποστηρίζεται από το αρχείο κεφαλίδας #include 'mingw.thread.h' στη C++11. Είναι μια κλάση νήματος και αντιπροσωπεύει ένα μόνο νήμα. Ένα νέο νήμα δημιουργείται χρησιμοποιώντας το std::thread και ένα καλέσιμο μεταβιβάζεται σε αυτό. Το Callable είναι ένας εκτελέσιμος κώδικας, ο οποίος εκτελείται όταν εκτελείται το νήμα. Η δυνατότητα κλήσης μπορεί να είναι οποιοσδήποτε από τους τρεις τύπους που δίνονται παρακάτω:

Όταν δημιουργείται ένα αντικείμενο, εκκινεί ένα νέο νήμα, το οποίο εκτελεί τον κώδικα στο καλούμενο.



Εκκίνηση του νήματος χρησιμοποιώντας το αντικείμενο της συνάρτησης

Ένα αντικείμενο συνάρτησης μπορεί να χρησιμοποιηθεί ως καλέσιμο για την εκκίνηση του νήματος, ο τελεστής υπερφόρτωσης () το κάνει καλέσιμο:

class function_object_class {
κενός τελεστής ( ) ( παραμέτρους )
{
Δηλώσεις?
}
}
std::thread thread_object ( function_object_class ( ) , παραμ )


Η συνάρτηση υπερφόρτωσης παρέχεται στον κατασκευαστή ως πρώτο αντικείμενο και οι δηλώσεις ως δεύτερο αντικείμενο.

Εκκίνηση νήματος χρησιμοποιώντας δείκτη συνάρτησης

Ένας δείκτης συνάρτησης ορίζεται και στη συνέχεια χρησιμοποιείται ως καλούμενος για την εκκίνηση ενός νήματος:

void function_call ( παραμ )
{
Δηλώσεις?
}
std::thread thread_obj ( function_call, παράμετροι ) ;


Τα ορίσματα που πρέπει να περάσουν γράφονται μετά το όνομα της συνάρτησης.

Εκκίνηση νήματος χρησιμοποιώντας την έκφραση λάμδα

Το αντικείμενο νήματος μπορεί να εκκινηθεί χρησιμοποιώντας το λάμδα ως καλούμενο.

// Ορίστε μια έκφραση λάμδα
αυτόματο f = [ ] ( παραμέτρους )
{
Δηλώσεις?
} ;

std::thread thread_object ( στ, παραμ ) ;


Η έκφραση λάμδα ορίζεται και οι παράμετροι καλούνται σε αυτήν για να ξεκινήσει το νήμα.

Σε ορισμένες περιπτώσεις, το νήμα πρέπει να σταματήσει  πριν ξεκινήσει να εκτελεί την επόμενη εντολή. ο std::thread::join () Η συνάρτηση χρησιμοποιείται για να περιμένει να τελειώσει το νήμα. Για παράδειγμα, σε περίπτωση που αναθέσουμε μια εργασία  GUI στο νήμα, πρέπει να περιμένουμε τον χρόνο ολοκλήρωσής του για να φορτωθεί σωστά το γραφικό περιβάλλον πρώτα και μετά θα πραγματοποιηθεί η εκτέλεση της επόμενης εντολής.

int main ( )
{

std::thread t1 ( κλητός ) ;
t1.συμμετέχω ( ) ;
Δηλώσεις?
}

Παράδειγμα

Αυτό είναι ένα πρόγραμμα που εκτελείται για την εκτέλεση πολλαπλών νημάτων χρησιμοποιώντας και τα τρία καλέσιμα. Τρεις διαφορετικοί καλούμενοι εκτελούν τις αντίστοιχες εντολές τους ταυτόχρονα τρεις φορές χωρίς να διακόπτονται η μία από την άλλη:

#include
#include <νήμα>
χρησιμοποιώντας namespace std?


void foo ( int Z )
{
Για ( int i = 0 ; Εγώ < Z; i++ ) {
cout << 'Νήμα με χρήση συνάρτησης'
' δείκτης ως καλούμενος \n ' ;
}
}


κλάση thread_obj {
δημόσιο:
κενός τελεστής ( ) ( int x )
{
Για ( int i = 0 ; Εγώ < Χ; i++ )
cout << 'Νήμα με χρήση συνάρτησης'
'αντικείμενο ως καλούμενο \n ' ;
}
} ;


// κύριος κωδικός
int main ( )
{
cout << 'Νήματα 1 και 2 και 3'
'λειτουργεί ανεξάρτητα'
<< endl;


νήμα th1 ( foo, 3 ) ;


νήμα th2 ( thread_obj ( ) , 3 ) ;


αυτόματο f = [ ] ( int x ) {
Για ( int i = 0 ; Εγώ < Χ; i++ )
cout << 'Νήμα χρησιμοποιώντας λάμδα'
«έκφραση ως καλούμενη \n ' ;
} ;


νήμα th3 ( φά, 3 ) ;

th1.εντάσσομαι ( ) ;

th2.εντάσσομαι ( ) ;

th3.συμμετέχω ( ) ;

ΕΠΙΣΤΡΟΦΗ 0 ;
}


Σε αυτό το πρόγραμμα τα τρία καλέσιμα, συμπεριλαμβανομένου του δείκτη συνάρτησης, του αντικειμένου συνάρτησης και της έκφρασης λάμδα χρησιμοποιούνται για την ταυτόχρονη εκκίνηση των τριών νημάτων. Τα νήματα 1, 2 και 3 εκτυπώνουν τις τιμές τους ταυτόχρονα, ανεξάρτητα το ένα από το άλλο, χωρίς να διακόπτονται το ένα από το άλλο. Εκτυπώνουν τις αξίες τους τρεις φορές. Η συνάρτηση join() χρησιμοποιείται για να περιμένει να τελειώσει το νήμα.


Οι έξοδοι και των τριών νημάτων εμφανίζονται ανεξάρτητα και επαναλαμβάνονται τρεις φορές. Κάθε νήμα περιμένει να τελειώσει πρώτα το άλλο.

συμπέρασμα

Το Multithreading στη C++ είναι μια δυνατότητα που επιτρέπει σε κάποιον να εκτελεί πολλές εργασίες ταυτόχρονα ταυτόχρονα. Το πρόγραμμα πολλαπλών νημάτων έχει δύο ή περισσότερες ενότητες που μπορούν να εκτελούνται ταυτόχρονα, κάθε τμήμα είναι γνωστό ως νήμα και έχει ξεχωριστή διαδρομή για εκτέλεση. Υπάρχουν τρία καλούμενα για την εκκίνηση νημάτων, δείκτες συνάρτησης, αντικείμενα συναρτήσεων και εκφράσεις λάμδα. Αυτά επιτρέπουν την πολυνηματική σύνδεση.