Jak implementovat multithreading v C++

Jak Implementovat Multithreading V C



Multithreading v C++ je funkce, která umožňuje provádět více úloh současně a souběžně. Vlákno je pracovní jednotka konkrétního prováděného procesu. Mnoho vláken se spouští nezávisle na sobě současně a provádějí vícevláknové zpracování.

Jak implementovat multithreading v C++

Vícevláknový program má dvě nebo více částí, které mají tendenci běžet současně, každá část je známá jako vlákno a má jinou cestu pro provádění. Mnoho vláken se spouští nezávisle na sobě současně a provádějí vícevláknové zpracování.







Předpoklady pro multithreading v C++

V systému Windows lze funkce související s vlákny provádět v C++ 11 a pokročilých verzích. Při použití kompilátoru Dev-C++ je ve výchozím nastavení na verzi C++ 3, takže je třeba jej ručně změnit na verzi C++ 11. Prostředí GNU C++11 lze vybrat změnou standardního nastavení jazyka.



Otevřete kompilátor Dev-C++ a přejděte na „Nástroje“ na hlavním panelu. Vyberte „Možnosti kompilátoru“ a poté „Nastavení“, klikněte na blok „Generování kódu“ a zobrazí se seznam příkazů. Vyberte GNU C++11 z “Language Standard(-std)” a poté klikněte na OK. Nyní je tento kompilátor nastaven na podporu operací vláken.




Stáhněte si knihovny z GitHubu a umístěte je do složky lib kompilátoru Cpp. Volejte tyto knihovny v programu pomocí #include “mingw.thread.h” a hlavičkových souborů , níže je jejich syntaxe:





std::thread thread_object ( povolatelný ) ;


std::thread je podporován #include „mingw.thread.h“ hlavičkovým souborem v C++11. Je to třída vláken a představuje jedno vlákno. Nové vlákno je vytvořeno pomocí std::thread a je mu předáno callable. Callable je spustitelný kód, který se spouští při spuštění vlákna. Volatelné může být kterýkoli ze tří níže uvedených typů:

Když je objekt vytvořen, spustí nové vlákno, které spustí kód v callable.



Spuštění vlákna pomocí Function Object

Funkční objekt lze použít jako volatelný ke spuštění vlákna, operátor přetížení () jej činí volatelným:

class function_object_class {
neplatný operátor ( ) ( parametry )
{
Výpisy;
}
}
std::thread thread_object ( funkční_třída_objektu ( ) , param )


Funkce přetížení je poskytnuta konstruktoru jako první objekt a příkazy jako druhý objekt.

Spuštění vlákna pomocí ukazatele funkce

Je definován ukazatel funkce a poté je použit jako volatelný ke spuštění vlákna:

void function_call ( param )
{
Výpisy;
}
std::thread thread_obj ( volání funkce, parametry ) ;


Argumenty, které mají být předány, se zapisují za název funkce.

Spuštění vlákna pomocí Lambda Expression

Objekt vlákna lze spustit pomocí lambda jako callable.

// Definujte výraz lambda
auto f = [ ] ( parametry )
{
Výpisy;
} ;

std::thread thread_object ( f, param ) ;


Je definován výraz lambda a jsou v něm volány parametry pro spuštění vlákna.

V některých případech se vlákno musí zastavit, než začne provádět další příkaz. The std::thread::join () funkce se používá k čekání na ukončení vlákna. Například v případě, že vláknu přiřadíme úlohu  GUI, musíme nejprve počkat na jeho dokončení, aby se GUI správně načetlo a poté by se provedlo další příkaz.

int main ( )
{

std::vlákno t1 ( povolatelný ) ;
t1.připojit se ( ) ;
Výpisy;
}

Příklad

Toto je program, který se spouští pro provádění multithreadingu pomocí všech tří volatelných. Tři různé callable provádějí své příslušné příkazy současně třikrát, aniž by byly navzájem přerušovány:

#include
#include
pomocí jmenného prostoru std;


void foo ( int Z )
{
pro ( int i = 0 ; i < Z; i++ ) {
cout << 'Vlákno pomocí funkce'
'ukazatel jako volatelný \n ' ;
}
}


třída vlákno_obj {
veřejnost:
neplatný operátor ( ) ( int x )
{
pro ( int i = 0 ; i < X; i++ )
cout << 'Vlákno pomocí funkce'
'objekt jako volatelný \n ' ;
}
} ;


// hlavní kód
int main ( )
{
cout << 'Vlákna 1 a 2 a 3'
'samostatně fungující'
<< endl;


vlákno th1 ( foo, 3 ) ;


vlákno th2 ( vlákno_obj ( ) , 3 ) ;


auto f = [ ] ( int x ) {
pro ( int i = 0 ; i < X; i++ )
cout << 'Vlákno pomocí lambdy'
'výraz jako volatelný.' \n ' ;
} ;


vlákno čt3 ( F, 3 ) ;

th1.připojit se ( ) ;

th2.připojit se ( ) ;

th3.připojit se ( ) ;

vrátit se 0 ;
}


V tomto programu se tři volatelné, včetně ukazatele funkce, objektu funkce a výrazu lambda, používají ke spuštění tří vláken současně. Vlákna 1, 2 a 3 tisknou své hodnoty současně, nezávisle na sobě, aniž by se navzájem přerušovala. Své hodnoty tisknou třikrát. Funkce join() se používá k čekání na konec vlákna.


Výstupy všech tří vláken jsou zobrazeny nezávisle a třikrát se opakují. Každé vlákno čeká, až to druhé skončí jako první.

Závěr

Multithreading v C++ je funkce, která umožňuje provádět více úloh současně a souběžně. Vícevláknový program má dvě nebo více sekcí, které mohou běžet současně, každá část je známá jako vlákno a má samostatnou cestu pro spuštění. Existují tři volatelné pro spouštění vláken, ukazatelů funkcí, objektů funkcí a výrazů lambda. Ty umožňují multithreading.