Multithreading u C++ je značajka koja omogućuje izvođenje više zadataka istovremeno u paraleli. Nit je radna jedinica određenog procesa koji se izvršava. Brojne niti izvršavaju se neovisno jedna o drugoj u isto vrijeme kako bi se izvršilo višenitnost.
Kako implementirati višenitnost u C++
Višenitni program ima dva ili više dijelova koji imaju tendenciju da se izvode istovremeno, svaki dio je poznat kao nit i ima drugačiji put za izvršenje. Brojne niti izvršavaju se neovisno jedna o drugoj u isto vrijeme kako bi se izvršilo višenitnost.
Preduvjeti za višenitnost u C++
U sustavu Windows funkcije povezane s nitima mogu se izvoditi u C++ 11 i naprednim verzijama. Dok koristite Dev-C++ prevodilac, prema zadanim postavkama on je na verziji C++ 3, pa ga je potrebno ručno promijeniti u verziju C++ 11. Okruženje GNU C++11 može se odabrati promjenom standardnih postavki jezika.
Otvorite Dev-C++ kompajler i idite na “Alati” na programskoj traci. Odaberite 'Opcije prevoditelja', a zatim odaberite 'Postavke', kliknite na blok 'Generacija koda' i pojavit će se popis naredbi. Odaberite GNU C++11 iz “Jezičnog standarda (-std)” i kliknite OK. Sada je ovaj prevodilac spreman za podršku operacija niti.
Preuzmite biblioteke s GitHuba i smjestite ih u mapu lib Cpp prevoditelja. Pozovite ove biblioteke u programu koristeći #include “mingw.thread.h” i
std::thread thread_object ( pozivivi ) ;
Datoteka zaglavlja #include “mingw.thread.h” u C++11 podržava std::thread. To je klasa niti i predstavlja jednu nit. Nova nit se stvara pomoću std::thread i prosljeđuje joj se callable. Callable je izvršni kod koji se izvršava kada se nit izvodi. Poziv može biti bilo koji od tri dolje navedena tipa:
Kada je objekt kreiran, on pokreće novu nit koja izvršava kod u pozivnom objektu.
Pokretanje niti pomoću funkcijskog objekta
Funkcijski objekt može se koristiti kao poziv za pokretanje niti, operator preopterećenja () čini ga pozivnim:
klasa funkcija_objekt_klasa {void operator ( ) ( parametri )
{
Izjave;
}
}
std::thread thread_object ( klasa_funkcionalnog_objekta ( ) , parametri )
Funkcija preopterećenja dana je konstruktoru kao prvom objektu, a iskazima kao drugom objektu.
Pokretanje niti pomoću pokazivača funkcije
Funkcijski pointer je definiran, a zatim se koristi kao poziv za pokretanje niti:
nevažeći poziv_funkcije ( param ){
Izjave;
}
std::nit thread_obj ( poziv_funkcije, parametri ) ;
Argumenti koje treba proslijediti pišu se iza naziva funkcije.
Pokretanje niti pomoću Lambda izraza
Objekt niti se može pokrenuti korištenjem lambda kao poziva.
// Definirajte lambda izrazauto f = [ ] ( parametri )
{
Izjave;
} ;
std::thread thread_object ( f, parametri ) ;
Lambda izraz je definiran iu njemu se pozivaju parametri za pokretanje niti.
U nekim slučajevima nit se mora zaustaviti prije nego što počne izvršavati sljedeću naredbu. The std::thread::join () funkcija se koristi za čekanje završetka niti. Na primjer, u slučaju da dretvi dodijelimo zadatak GUI-ja, moramo pričekati njegovo završno vrijeme da prvo ispravno učitamo GUI, a zatim će se izvršiti sljedeća naredba.
int glavni ( ){
std::nit t1 ( pozivivi ) ;
t1.pridružiti se ( ) ;
Izjave;
}
Primjer
Ovo je program koji se izvršava za izvođenje višenitnosti koristeći sva tri poziva. Tri različita pozivatelja izvršavaju svoje odgovarajuće naredbe istovremeno tri puta bez da ih jedan drugi prekida:
#include#include
korištenje imenskog prostora std;
praznina foo ( int Z )
{
za ( int i = 0 ; ja < Z; i++ ) {
cout << 'Funkcija pomoću niti'
' pokazivač kao poziv \n ' ;
}
}
klasa thread_obj {
javnost:
void operator ( ) ( int x )
{
za ( int i = 0 ; ja < x; i++ )
cout << 'Funkcija pomoću niti'
' objekt kao pozivljiv \n ' ;
}
} ;
// glavni kod
int glavni ( )
{
cout << 'Niti 1 i 2 i 3'
'posluje samostalno'
<< endl;
nit th1 ( fuj, 3 ) ;
nit th2 ( nit_obj ( ) , 3 ) ;
auto f = [ ] ( int x ) {
za ( int i = 0 ; ja < x; i++ )
cout << 'Nit pomoću lambda'
' izraz kao pozivljiv \n ' ;
} ;
nit th3 ( f, 3 ) ;
th1.pridružiti se ( ) ;
th2.pridružiti se ( ) ;
th3.pridružiti se ( ) ;
povratak 0 ;
}
U ovom programu tri poziva uključujući funkcijski pokazivač, funkcijski objekt i lambda izraz koriste se za istovremeno pokretanje tri niti. Niti 1, 2 i 3 ispisuju svoje vrijednosti istovremeno, neovisno jedna o drugoj, bez da ih jedna druga prekida. Svoje vrijednosti ispisuju triput. Funkcija join() koristi se za čekanje završetka niti.
Izlazi sve tri niti prikazani su neovisno i ponavljaju se tri puta. Svaka nit čeka da prva završi druga.
Zaključak
Multithreading u C++ je značajka koja omogućuje izvođenje više zadataka istovremeno u paraleli. Program s više niti ima dva ili više odjeljaka koji se mogu izvoditi istovremeno, svaki dio je poznat kao nit i ima zaseban put za izvršavanje. Postoje tri poziva za pokretanje niti, pokazivača funkcija, funkcijskih objekata i lambda izraza. Oni omogućuju višenitnost.