multithreading c with examples
Kratki uvod u multithreading na jeziku C ++.
U ovom uputstvu dobit ćemo pregled multithreadinga na C ++.
Pa, što je nit? Konac je radna jedinica određenog procesa. U operacijskim sustavima s više programa, različiti se procesi izvršavaju istovremeno.
Na sličan način, možda bismo htjeli istodobno izvršavati iste instance procesa. Svaka je instanca procesa, u ovom slučaju, dodijeljena izvršnoj jedinici koja se naziva nit. U multithreading sustavu brojne se niti izvršavaju istovremeno neovisno jedna o drugoj.
=> Ovdje pogledajte vodič za početnike C ++.
besplatni softver za popravak računala za Windows 10
Prije C ++ 11 imali smo podršku za POSIX niti. Ali ova je značajka imala ozbiljnih problema s prenosivošću, jer je radila samo na operacijskom sustavu Linux ili UNIX. Tako od C ++ 11 nadalje imamo jednu klasu std :: nit koja definira svu funkcionalnost niti. Klase i funkcije definirane su u zaglavnoj datoteci.
Što ćete naučiti:
Working Of
Koristeći std :: thread jednostavno trebamo stvoriti novi objekt niti i proslijediti ga na poziv. Pozivni je izvršni kôd koji želimo izvršiti kada je nit pokrenuta. Dakle, kad god želimo novu nit, mi samo kreiramo objekt std :: thread i prosljeđujemo pozivi kao argument njegovom konstruktoru.
Jednom kada je std :: thread objekt stvoren, pokreće se nova nit i izvršava se kod koji pruža callable.
Pogledajmo kako možemo definirati pozivni poziv koji se pruža objektu niti.
Pozivi se mogu definirati na tri načina.
# 1) Korištenje objekta funkcije
Objekt funkcije možemo koristiti kao poziv u objektu niti. Da bismo koristili objekt funkcije, moramo imati klasu i u toj klasi preopterećujemo operator (). Ova preopterećena funkcija sadrži kôd koji treba izvršiti kada se nit stvori.
/ / 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)
Obratite pažnju na način na koji je objekt niti definiran. Kao prvi parametar konstruktoru objekta niti pružamo preopterećenu funkciju, a zatim kao drugi argument navodimo njene argumente (paramere).
# 2) Korištenje pokazivača funkcije
Pozivajući se pomoću pokazivača funkcije može se definirati na sljedeći način.
void funct_call(params) //code to be executed }
Jednom kada definiramo ovu funkciju, možemo stvoriti objekt niti s ovom funkcijom kao pozivom, na sljedeći način.
std::thread thread_obj(funct_call, params);
Imajte na umu da se argumenti (parami) prosljeđeni funkciji daju nakon imena funkcije u objektu niti.
# 3) Korištenje Lambda izraza
Također možemo imati poziv kao lambda izraz i proslijediti ga objektu niti za izvršenje. Isječak koda za isti prikazan je u nastavku.
// Define a lambda expression auto f = ()(params) { // code for execution };
std::thread thread_object(f, params);
U gornjem kodu definirali smo lambda izraz f, a zatim ga prosljeđujemo konstruktoru niti kao prvi argument, a zatim njegovi parametri (parametri) kao drugi argument.
std::thread join method
U nekim ćemo slučajevima možda htjeti da se trenutačno izvršava nit završi prije nego započnemo drugu radnju.
Klasičan je primjer kada otvorimo GUI aplikaciju. U trenutku kada otvorimo aplikaciju, pokreće se nit za učitavanje i inicijalizaciju GUI-a i ne možemo izvršiti nikakve radnje ako se učitavanje i inicijalizacija ne izvrše ispravno kako bi se osiguralo da GUI ispravno funkcionira.
besplatni YouTube Video Converter u mp4
Klasa std :: thread pruža metodu join () koja osigurava da trenutna nit (na koju ukazuje * this) završi prva prije poduzimanja bilo koje druge radnje.
Uzmimo sljedeći primjer,
int main() { std::thread t1(callable_code); ….. t1.join(); ….. }
U gornjem primjeru, glavna funkcija morat će pričekati da nastavi dok se nit t1 ne završi. Općenito, funkcija pridruživanja niti blokira druge radnje / funkcionalnost sve dok pozivanje niti ne završi svoje izvršavanje.
Primjer niti
Predstavljamo cjelovit primjer kodiranja za stvaranje i izvršavanje niti u dolje prikazanom programu.
#include #include using namespace std; // function to be used in callable void func_dummy(int N) { for (int i = 0; i Izlaz:
Tema 1 :: pokazivač => pokazivač funkcije
Tema 1 :: pokazivač => pokazivač funkcije
Tema 3 :: callable => lambda izraz
Tema 3 :: callable => lambda izraz
Tema 2 :: pozivni => objekt funkcije
Tema 2 :: pozivni => objekt funkcije
U gornjem primjeru stvorili smo tri niti koristeći tri različita poziva koja se mogu pozivati, tj. Pokazivač funkcije, objekt i lambda izraz. Izrađujemo 2 primjerka svake niti i pokrećemo ih. Kao što je prikazano u izlazu, tri niti djeluju istovremeno neovisno jedna o drugoj.
Preporučena literatura = >> Vodič za ispitivanje niti
Zaključak
U ovom uputstvu vidjeli smo koncepte višestrukog uvođenja u C ++ s jasnim primjerom. U sljedećim tutorijalima naučit ćemo više C ++ tema koje bi nam pomogle da napišemo robusne i učinkovite programe.
=> Pročitajte jednostavnu seriju C ++ treninga.
Preporučena literatura
- Vodič za glavne funkcije Pythona s praktičnim primjerima
- Python DateTime Vodič s primjerima
- Izreži naredbu u Unixu s primjerima
- Sintaksa naredbe Unix Cat, mogućnosti s primjerima
- Primjena pokazivača u MongoDB-u s primjerima
- Ls naredba u Unixu s primjerima
- MongoDB metoda sortiranja () s primjerima
- Grep naredba u Unixu s jednostavnim primjerima