multithreading c with examples
Stručný úvod do multithreadingu v C ++.
náhodné číslo mezi 0 a 1 c ++
V tomto kurzu získáme přehled multithreadingu v C ++.
Co je to vlákno? Vlákno je pracovní jednotka konkrétního procesu. V multi-programovacích operačních systémech probíhají současně různé procesy.
Podobným způsobem můžeme chtít spustit stejné instance procesu současně. Každá instance procesu je v tomto případě přiřazena k prováděcí jednotce zvané vlákno. V systému s více vlákny se mnoho vláken spouští současně nezávisle na sobě.
=> Prohlédněte si Průvodce pro začátečníky v C ++ zde.
Před C ++ 11 jsme měli podporu podprocesů POSIX. Tato funkce však měla vážné problémy s přenositelností, protože fungovala pouze v operačním systému Linux nebo UNIX. Od C ++ 11 dále tedy máme jedinou třídu std :: vlákno který definuje všechny funkce pro vlákna. Třídy a funkce jsou definovány v hlavičkovém souboru.
Co se naučíte:
Práce
Pomocí std :: thread jednoduše musíme vytvořit nový objekt vlákna a předat jej volatelný. Vyvolávatelný je spustitelný kód, který chceme spustit, když je vlákno spuštěno. Takže kdykoli chceme nové vlákno, vytvoříme pouze objekt std :: thread a předáme volající jako argument jeho konstruktoru.
Po vytvoření objektu std :: thread se spustí nové vlákno a provede se kód poskytnutý callable.
Podívejme se, jak můžeme definovat výzvu, která má být poskytnuta objektu vlákna.
Vyvolávanou část lze definovat třemi způsoby.
# 1) Použití funkčního objektu
Můžeme použít funkční objekt jako volaný v objektu vlákna. Pro použití funkčního objektu musíme mít třídu a v této třídě přetížíme operátor (). Tato přetížená funkce obsahuje kód, který se má provést při vytvoření vlákna.
vkládání a mazání binárních stromů v Javě
/ / 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šimněte si, jakým způsobem je definován objekt vlákna. Jako první parametr konstruktoru objektu vlákna poskytneme přetíženou funkci a poté jako druhý argument určíme jeho argumenty (parametry).
# 2) Použití funkčního ukazatele
Vyvolávatelný pomocí ukazatele funkce lze definovat následujícím způsobem.
void funct_call(params) //code to be executed }
Jakmile definujeme tuto funkci, můžeme vytvořit vláknový objekt s touto funkcí jako volatelnou, a to následujícím způsobem.
std::thread thread_obj(funct_call, params);
Všimněte si, že argumenty (parametry) předané funkci jsou poskytovány za názvem funkce v objektu vlákna.
# 3) Použití výrazu lambda
Můžeme také mít callable jako lambda výraz a předat jej objektu vlákna k provedení. Fragment kódu pro stejný je uveden níže.
// Define a lambda expression auto f = ()(params) { // code for execution };
std::thread thread_object(f, params);
Ve výše uvedeném kódu jsme definovali lambda výraz f a poté jej předáme konstruktoru objektu vlákna jako první argument následovaný jeho parametry (parametry) jako druhý argument.
std::thread join method
V některých případech můžeme chtít, aby aktuálně provádějící vlákno skončilo před zahájením další akce.
Klasickým příkladem je, když otevřeme aplikaci GUI. V okamžiku, kdy aplikaci otevřete, je spuštěno vlákno pro načtení a inicializaci grafického uživatelského rozhraní a nemůžeme provést žádnou akci, pokud se načítání a inicializace neprovádí správně, aby se zajistilo správné fungování grafického uživatelského rozhraní.
Třída std :: thread poskytuje metodu join (), která zajišťuje, že aktuální vlákno (označené * this) skončí jako první před provedením jakékoli další akce.
Vezměte si následující příklad,
int main() { std::thread t1(callable_code); ….. t1.join(); ….. }
Ve výše uvedeném příkladu bude hlavní funkce muset počkat, než bude pokračovat, dokud vlákno t1 nedokončí. Obecně funkce spojení vlákna blokuje další akce / funkce, dokud volání vlákna nedokončí své provádění.
Příklad vlákna
Uvádíme kompletní příklad kódování pro vytvoření a provedení vlákna v níže uvedeném programu.
#include #include using namespace std; // function to be used in callable void func_dummy(int N) { for (int i = 0; i Výstup:
Vlákno 1 :: callable => ukazatel funkce
Vlákno 1 :: callable => ukazatel funkce
Vlákno 3 :: callable => výraz lambda
Vlákno 3 :: callable => výraz lambda
Vlákno 2 :: callable => funkční objekt
Vlákno 2 :: callable => funkční objekt
Ve výše uvedeném příkladu jsme vytvořili tři vlákna pomocí tří různých volaných, tj. Ukazatel funkce, objekt a výraz lambda. Vytvoříme 2 instance každého vlákna a spustíme je. Jak je znázorněno na výstupu, tři vlákna pracují současně nezávisle na sobě.
Doporučené čtení = >> Průvodce testováním nití
Závěr
V tomto kurzu jsme viděli vícevláknové koncepty v C ++ s jasným příkladem. V našich dalších výukách se naučíme více témat C ++, která by nám pomohla psát robustní a efektivní programy.
nejjednodušší způsob, jak přidat hodnoty do pole, je použít
=> Přečtěte si sérii školení Easy C ++.
Doporučené čtení
- Výukový program pro hlavní funkce Pythonu s praktickými příklady
- Výukový program Python DateTime s příklady
- Vyjmout příkaz v Unixu s příklady
- Syntaxe příkazů Unix Cat, možnosti s příklady
- Použití kurzoru v MongoDB s příklady
- Příkaz LS v Unixu s příklady
- Metoda MongoDB Sort () s příklady
- Příkaz Grep v Unixu s jednoduchými příklady