multithreading c with examples
Stručný úvod do multithreadingu v C ++.
V tomto tutoriáli získame prehľad multithreadingu v C ++.
Čo je to teda vlákno? Vlákno je pracovná jednotka konkrétneho procesu. V operačných systémoch s viacerými programami prebiehajú rôzne procesy súčasne.
Podobným spôsobom môžeme chcieť vykonať rovnaké inštancie procesu súčasne. Každá inštancia procesu je v tomto prípade priradená k exekučnej jednotke zvanej vlákno. V systéme s viacerými vláknami sa mnoho vlákien vykonáva súčasne nezávisle na sebe.
=> Tu si pozrite príručku pre začiatočníkov v C ++.
Pred C ++ 11 sme mali podporu vlákien POSIX. Táto funkcia však mala vážne problémy s prenosnosťou, pretože fungovala iba v operačných systémoch Linux alebo UNIX. Od C ++ 11 a ďalej teda máme jednu triedu std :: vlákno ktorá definuje všetky funkcie vlákien. Triedy a funkcie sú definované v hlavičkovom súbore.
Čo sa dozviete:
Pracovné
Pomocou std :: thread jednoducho musíme vytvoriť nový objekt vlákna a odovzdať ho zavolať. Vyvolávateľný je spustiteľný kód, ktorý chceme vykonať, keď je vlákno spustené. Takže kedykoľvek chceme nové vlákno, jednoducho vytvoríme objekt std :: thread a pošleme volané ako argument jeho konštruktoru.
Po vytvorení objektu std :: thread sa spustí nové vlákno a vykoná sa kód poskytnutý volaním.
Pozrime sa, ako môžeme definovať výzvu, ktorá sa má poskytnúť objektu vlákna.
Vyzývateľnosť je možné definovať tromi spôsobmi.
# 1) Používanie funkčného objektu
Funkčný objekt môžeme použiť ako vyvolaný v objekte vlákna. Na použitie funkčného objektu musíme mať triedu a v tejto triede preťažíme operátor (). Táto preťažená funkcia obsahuje kód, ktorý sa má vykonať pri vytvorení vlákna.
/ / 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)
Všimnite si spôsob, akým je definovaný objekt vlákna. Ako prvý parameter konštruktoru objektu vlákna poskytneme preťaženú funkciu a potom zadáme jej argumenty (parametre) ako druhý argument.
# 2) Pomocou ukazovateľa funkcie
Vyvolateľné pomocou ukazovateľa funkcie možno definovať nasledujúcim spôsobom.
void funct_call(params) //code to be executed }
Keď definujeme túto funkciu, môžeme vytvoriť vláknový objekt s touto funkciou, ktorý je volaný, nasledujúcim spôsobom.
std::thread thread_obj(funct_call, params);
Upozorňujeme, že argumenty (parametre) odovzdané funkcii sú uvedené za názvom funkcie v objekte vlákna.
# 3) Použitie výrazu lambda
Môžeme tiež mať volaný ako výraz lambda a odovzdať ho objektu vlákna na vykonanie. Fragment kódu rovnakého kódu je uvedený nižšie.
// Define a lambda expression auto f = ()(params) { // code for execution };
std::thread thread_object(f, params);
Vo vyššie uvedenom kóde sme definovali výraz lambda f a potom ho odovzdáme konštruktoru objektu vlákna ako prvý argument, za ktorým nasledujú jeho parametre (parametre) ako druhý argument.
std::thread join method
V niektorých prípadoch môžeme chcieť, aby sa práve vykonávajúce vlákno skončilo skôr, ako začneme s ďalšou akciou.
Klasickým príkladom je, keď otvoríme aplikáciu GUI. V okamihu, keď otvoríme aplikáciu, je spustené vlákno na načítanie a inicializáciu grafického používateľského rozhrania a nemôžeme vykonať žiadnu akciu, pokiaľ načítanie a inicializácia nie sú vykonané správne, aby sme zaistili správne fungovanie grafického používateľského rozhrania.
Trieda std :: thread poskytuje metódu join (), ktorá zaisťuje, že aktuálne vlákno (označené * this) skončí ako prvé pred vykonaním akejkoľvek ďalšej akcie.
Vezmite si nasledujúci príklad,
int main() { std::thread t1(callable_code); ….. t1.join(); ….. }
Vo vyššie uvedenom príklade bude musieť hlavná funkcia čakať na pokračovanie, kým sa vlákno t1 neskončí. Vo všeobecnosti funkcia spojenia vlákna blokuje ďalšie akcie / funkcie, kým volanie vlákna nedokončí svoje vykonávanie.
Príklad vlákna
Uvádzame kompletný príklad kódovania pre vytvorenie a vykonanie vlákna v programe uvedenom nižšie.
#include #include using namespace std; // function to be used in callable void func_dummy(int N) { for (int i = 0; i Výkon:
char na int c ++
Vlákno 1 :: volané => ukazovateľ funkcie
Vlákno 1 :: volané => ukazovateľ funkcie
Vlákno 3 :: Vyvolávateľné => výraz lambda
Vlákno 3 :: Vyvolávateľné => výraz lambda
Vlákno 2 :: Vyvolávateľné => Funkčný objekt
Vlákno 2 :: Vyvolávateľné => Funkčný objekt
Vo vyššie uvedenom príklade sme vytvorili tri vlákna pomocou troch rôznych volaných, tj. Ukazovateľ funkcie, objekt a výraz lambda. Vytvoríme 2 inštancie každého vlákna a spustíme ich. Ako je znázornené na výstupe, tri vlákna pracujú súčasne nezávisle na sebe.
Odporúčané čítanie = >> Sprievodca testovaním nití
Záver
V tomto tutoriáli sme videli koncepcie viacvláknového vlákna v C ++ s názorným príkladom. V našich ďalších tutoriáloch sa dozvieme viac tém v jazyku C ++, ktoré by nám pomohli pri písaní robustných a efektívnych programov.
=> Prečítajte si sériu školení Easy C ++.
Odporúčané čítanie
- Výukový program pre hlavné funkcie Pythonu s praktickými príkladmi
- Výukový program pre Python DateTime s príkladmi
- Vystrihnite príkaz v systéme Unix s príkladmi
- Syntax príkazov Unix Cat, možnosti s príkladmi
- Používanie kurzora v MongoDB s príkladmi
- Príkaz Ls v systéme Unix s príkladmi
- Metóda MongoDB Sort () s príkladmi
- Príkaz Grep v systéme Unix s jednoduchými príkladmi