Ako implementovať multithreading v C++

Ako Implementovat Multithreading V C



Multithreading v C++ je funkcia, ktorá umožňuje vykonávať viacero úloh súčasne. Vlákno je pracovná jednotka konkrétneho vykonávaného procesu. Mnoho vlákien sa vykonáva nezávisle od seba súčasne, aby sa vykonávalo viacvláknové spracovanie.

Ako implementovať multithreading v C++

Viacvláknový program má dve alebo viac častí, ktoré majú tendenciu bežať súčasne, každá časť je známa ako vlákno a má inú cestu na vykonanie. Mnoho vlákien sa vykonáva nezávisle od seba súčasne, aby sa vykonávalo viacvláknové spracovanie.







Predpoklady pre multithreading v C++

Vo Windowse možno funkcie súvisiace s vláknami vykonávať v C++ 11 a pokročilých verziách. Pri používaní kompilátora Dev-C++ je štandardne na verzii C++ 3, takže je potrebné ho zmeniť na verziu C++ 11 manuálne. Prostredie GNU C++11 je možné zvoliť zmenou nastavenia štandardu jazyka.



Otvorte kompilátor Dev-C++ a prejdite na „Nástroje“ na paneli úloh. Vyberte „Možnosti kompilátora“ a potom vyberte „Nastavenia“, kliknite na blok „Generovanie kódu“ a zobrazí sa zoznam príkazov. Vyberte GNU C++11 z “Language Standard(-std)” a potom kliknite na OK. Teraz je tento kompilátor nastavený na podporu operácií vlákien.




Stiahnite si knižnice z GitHub a umiestnite ich do priečinka lib kompilátora Cpp. Zavolajte tieto knižnice v programe pomocou #include “mingw.thread.h” a hlavičkových súborov , nižšie je ich syntax:





std::thread thread_object ( volateľný ) ;


Vlákno std::thread je podporované #include hlavičkovým súborom “mingw.thread.h” v C++11. Je to trieda vlákien a predstavuje jedno vlákno. Nové vlákno sa vytvorí pomocou std::thread a odovzdá sa mu volateľné vlákno. Callable je spustiteľný kód, ktorý sa spúšťa pri spustení vlákna. Volateľné môžu byť niektoré z troch typov uvedených nižšie:

Keď sa vytvorí objekt, spustí sa nové vlákno, ktoré spustí kód vo volateľnej časti.



Spustenie vlákna pomocou objektu funkcie

Funkčný objekt možno použiť ako volateľný na spustenie vlákna, operátor preťaženia () ho robí volateľným:

class function_object_class {
neplatný operátor ( ) ( parametre )
{
Vyhlásenia;
}
}
std::thread thread_object ( function_object_class ( ) , param )


Funkcia preťaženia je poskytnutá konštruktorovi ako prvý objekt a príkazy ako druhý objekt.

Spustenie vlákna pomocou ukazovateľa funkcie

Je definovaný ukazovateľ funkcie a potom sa používa ako volateľný na spustenie vlákna:

void function_call ( param )
{
Vyhlásenia;
}
std::thread thread_obj ( function_call, params ) ;


Argumenty, ktoré sa majú odovzdať, sa píšu za názvom funkcie.

Spustenie vlákna pomocou výrazu Lambda

Objekt vlákna možno spustiť pomocou lambda ako volateľného.

// Definujte výraz lambda
auto f = [ ] ( parametre )
{
Vyhlásenia;
} ;

std::thread thread_object ( f, param ) ;


Je definovaný výraz lambda a v ňom sú volané parametre na spustenie vlákna.

V niektorých prípadoch sa vlákno musí zastaviť predtým, ako začne vykonávať ďalší príkaz. The std::thread::join () funkcia sa používa na čakanie na koniec vlákna. Napríklad v prípade, že vláknu priradíme úlohu  GUI, musíme najprv počkať na čas jej dokončenia, aby sa správne načítalo GUI, a potom sa vykoná ďalší príkaz.

int main ( )
{

std::vlákno t1 ( volateľný ) ;
t1.spojiť sa ( ) ;
Vyhlásenia;
}

Príklad

Toto je program, ktorý sa vykonáva na vykonávanie multithreadingu pomocou všetkých troch volateľných. Tri rôzne volateľné funkcie vykonávajú svoje príslušné príkazy súčasne trikrát bez toho, aby boli navzájom prerušené:

#include
#include
pomocou menného priestoru std;


void foo ( int Z )
{
pre ( int i = 0 ; i < Z; i++ ) {
cout << 'Vlákno pomocou funkcie'
'ukazovateľ ako volateľný \n ' ;
}
}


trieda vlákno_obj {
verejné:
neplatný operátor ( ) ( int x )
{
pre ( int i = 0 ; i < X; i++ )
cout << 'Vlákno pomocou funkcie'
„objekt ako volateľný \n ' ;
}
} ;


// hlavný kód
int main ( )
{
cout << 'Vlákna 1 a 2 a 3'
'funguje nezávisle'
<< endl;


závit th1 ( foo, 3 ) ;


závit th2 ( vlákno_obj ( ) , 3 ) ;


auto f = [ ] ( int x ) {
pre ( int i = 0 ; i < X; i++ )
cout << 'Vlákno pomocou lambdy'
„výraz ako volateľný \n ' ;
} ;


závit th3 ( f, 3 ) ;

th1.pripojiť sa ( ) ;

th2.pripoj sa ( ) ;

th3.pripoj sa ( ) ;

vrátiť 0 ;
}


V tomto programe sa tri volateľné položky vrátane ukazovateľa funkcie, objektu funkcie a výrazu lambda používajú na spustenie troch vlákien súčasne. Vlákna 1, 2 a 3 tlačia svoje hodnoty súčasne, nezávisle od seba, bez toho, aby sa navzájom prerušovali. Svoje hodnoty vytlačia trikrát. Funkcia join() sa používa na čakanie na koniec vlákna.


Výstupy všetkých troch vlákien sú zobrazené nezávisle a opakujú sa trikrát. Každé vlákno čaká, kým to druhé skončí ako prvé.

Záver

Multithreading v C++ je funkcia, ktorá umožňuje vykonávať viacero úloh súčasne. Viacvláknový program má dve alebo viac sekcií, ktoré môžu bežať súčasne, každá časť je známa ako vlákno a má samostatnú cestu na spustenie. Existujú tri volateľné na spustenie vlákien, ukazovateľov funkcií, funkčných objektov a výrazov lambda. Tieto umožňujú multithreading.