multithreading c with examples
Μια σύντομη εισαγωγή στο Multithreading στο C ++.
Σε αυτό το σεμινάριο, θα λάβουμε μια επισκόπηση του multithreading στο C ++.
Τι είναι λοιπόν ένα νήμα; Ένα νήμα είναι μια μονάδα εργασίας μιας συγκεκριμένης διαδικασίας. Σε λειτουργικά συστήματα πολλαπλού προγραμματισμού, διαφορετικές διαδικασίες εκτελούνται ταυτόχρονα.
Με παρόμοιο τρόπο, ίσως θέλουμε να εκτελέσουμε τις ίδιες παρουσίες διαδικασίας ταυτόχρονα. Κάθε παρουσία διαδικασίας, σε αυτήν την περίπτωση, εκχωρείται σε μια μονάδα εκτέλεσης που ονομάζεται νήμα. Σε ένα σύστημα πολλαπλών νημάτων, πολλά νήματα εκτελούνται ταυτόχρονα ανεξάρτητα το ένα από το άλλο.
τι μπορείτε να κάνετε με το c ++
=> Ρίξτε μια ματιά στον οδηγό για αρχάριους C ++ εδώ.
Πριν από το C ++ 11, είχαμε υποστήριξη νήματος POSIX. Αλλά αυτή η δυνατότητα είχε σοβαρά προβλήματα φορητότητας, καθώς λειτούργησε μόνο στο λειτουργικό σύστημα Linux ή UNIX. Έτσι από το C ++ 11 και μετά, έχουμε μια ενιαία τάξη std :: νήμα που καθορίζει όλες τις λειτουργίες των νημάτων. Οι κλάσεις και οι συναρτήσεις ορίζονται στο αρχείο κεφαλίδας.
Τι θα μάθετε:
Εργασία του
Χρησιμοποιώντας το std :: thread απλά πρέπει να δημιουργήσουμε ένα νέο αντικείμενο νήματος και να το περάσουμε με δυνατότητα κλήσης. Ένα callable είναι ένας εκτελέσιμος κώδικας που θέλουμε να εκτελέσουμε όταν εκτελείται το νήμα. Έτσι, όποτε θέλουμε ένα νέο νήμα, δημιουργούμε απλώς ένα αντικείμενο του std :: thread και μεταβιβάζουμε ένα callable ως επιχείρημα στον κατασκευαστή του.
Μόλις δημιουργηθεί το αντικείμενο std :: thread, ξεκινά ένα νέο νήμα και εκτελείται ο κωδικός που παρέχεται από το callable.
Ας δούμε πώς μπορούμε να ορίσουμε μια κλήση που πρέπει να παρέχεται στο αντικείμενο νήματος.
Ένα callable μπορεί να οριστεί με τρεις τρόπους.
# 1) Χρήση του αντικειμένου συνάρτησης
Μπορούμε να χρησιμοποιήσουμε ένα αντικείμενο συνάρτησης ως κλήσιμο στο αντικείμενο του νήματος. Για τη χρήση του αντικειμένου συνάρτησης, πρέπει να έχουμε μια κλάση και σε αυτήν την κατηγορία, υπερφορτώνουμε τον χειριστή (). Αυτή η υπερφορτωμένη συνάρτηση περιέχει τον κώδικα που θα εκτελεστεί κατά τη δημιουργία του νήματος.
/ / Define the class for function object class functioObject_class { // Overload () operator void operator()(params) { // code to be executed } }; // Create thread object
std::thread thread_object(functioObject_class (), params)
Σημειώστε τον τρόπο με τον οποίο ορίζεται το αντικείμενο νήματος. Ως η πρώτη παράμετρος στον κατασκευαστή του αντικειμένου νήματος, παρέχουμε τη συνάρτηση υπερφόρτωσης και στη συνέχεια καθορίζουμε τα ορίσματά της (params) ως το δεύτερο όρισμα.
# 2) Χρήση του δείκτη λειτουργίας
Μπορείτε να ορίσετε έναν δείκτη λειτουργίας με δυνατότητα κλήσης με τον ακόλουθο τρόπο.
void funct_call(params) //code to be executed }
Μόλις ορίσουμε αυτήν τη συνάρτηση, μπορούμε να δημιουργήσουμε ένα αντικείμενο νήματος με αυτήν τη συνάρτηση ως δυνατότητα κλήσης, με τον ακόλουθο τρόπο.
std::thread thread_obj(funct_call, params);
Σημειώστε ότι τα ορίσματα (παράμετροι) που μεταβιβάστηκαν στη συνάρτηση, παρέχονται μετά το όνομα της συνάρτησης στο αντικείμενο νήματος.
# 3) Χρησιμοποιώντας μια έκφραση Lambda
Μπορούμε επίσης να έχουμε μια κλήση ως έκφραση λάμδα και να την περάσουμε στο αντικείμενο νήματος για εκτέλεση. Το απόσπασμα κώδικα για το ίδιο εμφανίζεται παρακάτω.
// Define a lambda expression auto f = ()(params) { // code for execution };
std::thread thread_object(f, params);
Στον παραπάνω κώδικα, έχουμε ορίσει μια έκφραση λάμδα f και στη συνέχεια τη μεταφέρουμε στον κατασκευαστή αντικειμένου νήματος ως το πρώτο όρισμα ακολουθούμενο από τις παραμέτρους του (params) ως το δεύτερο όρισμα.
std::thread join method
Σε ορισμένες περιπτώσεις, ίσως θέλουμε το νήμα που εκτελείται αυτήν τη στιγμή να τελειώσει προτού ξεκινήσουμε μια άλλη ενέργεια.
Ένα κλασικό παράδειγμα είναι όταν ανοίγουμε την εφαρμογή GUI. Μόλις ανοίξουμε την εφαρμογή, ξεκινά ένα νήμα για φόρτωση και αρχικοποίηση του GUI και δεν μπορούμε να εκτελέσουμε καμία ενέργεια, εκτός εάν η φόρτωση και η προετοιμασία γίνεται σωστά, ώστε να διασφαλίσουμε ότι το GUI λειτουργεί σωστά.
c ++ μετατροπή char σε συμβολοσειρά
Η κλάση std :: thread παρέχει μια μέθοδο join () η οποία διασφαλίζει ότι το τρέχον νήμα (που υποδεικνύεται από * αυτό) τελειώνει πρώτα πριν αναληφθεί οποιαδήποτε άλλη ενέργεια.
Πάρτε το ακόλουθο παράδειγμα,
int main() { std::thread t1(callable_code); ….. t1.join(); ….. }
Στο παραπάνω παράδειγμα, η κύρια λειτουργία θα πρέπει να περιμένει για να συνεχιστεί έως ότου τελειώσει το νήμα t1. Σε γενικές γραμμές, η συνάρτηση σύνδεσης του νήματος αποκλείει άλλες ενέργειες / λειτουργίες έως ότου η κλήση νήματος ολοκληρώσει την εκτέλεση της.
Παράδειγμα νήματος
Παρουσιάζουμε ένα πλήρες παράδειγμα κωδικοποίησης για τη δημιουργία και εκτέλεση του νήματος στο πρόγραμμα που φαίνεται παρακάτω.
#include #include using namespace std; // function to be used in callable void func_dummy(int N) { for (int i = 0; i Παραγωγή:
Νήμα 1 :: callable => δείκτης λειτουργίας
Νήμα 1 :: callable => δείκτης λειτουργίας
Θέμα 3 :: callable => έκφραση λάμδα
Θέμα 3 :: callable => έκφραση λάμδα
Θέμα 2 :: callable => αντικείμενο λειτουργίας
Θέμα 2 :: callable => αντικείμενο λειτουργίας
Στο παραπάνω παράδειγμα, έχουμε δημιουργήσει τρία νήματα χρησιμοποιώντας τρία διαφορετικά callable, δηλαδή δείκτη λειτουργίας, αντικείμενο και έκφραση λάμδα. Δημιουργούμε 2 παρουσίες κάθε νήματος και τις ξεκινάμε. Όπως φαίνεται στην έξοδο, τρία νήματα λειτουργούν ταυτόχρονα ανεξάρτητα το ένα από το άλλο.
Συνιστώμενη ανάγνωση = >> Οδηγός δοκιμής νημάτων
συμπέρασμα
Σε αυτό το σεμινάριο, έχουμε δει τις ιδέες πολλαπλών νημάτων στο C ++ με ένα σαφές παράδειγμα. Στα επόμενα σεμινάριά μας, θα μάθουμε περισσότερα θέματα C ++ που θα μας βοηθήσουν να γράψουμε ισχυρά και αποτελεσματικά προγράμματα.
=> Διαβάστε το The Easy C ++ Training Series.
Συνιστώμενη ανάγνωση
- Εκπαιδευτικό πρόγραμμα Python Main Function με πρακτικά παραδείγματα
- Εκμάθηση Python DateTime με παραδείγματα
- Αποκοπή εντολής στο Unix με παραδείγματα
- Unix Cat Command Syntax, Επιλογές με παραδείγματα
- Χρήση δρομέα στο MongoDB με παραδείγματα
- Ls Command στο Unix με παραδείγματα
- MongoDB Sort () Μέθοδος με παραδείγματα
- Εντολή Grep στο Unix με απλά παραδείγματα