Kako implementirati višenitnost u C++

Kako Implementirati Visenitnost U C



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 datoteke zaglavlja, dolje je njihova sintaksa:





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 izraz
auto 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.