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ů
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 lambdaauto 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.