Přehled Concurrency Runtime
Tento dokument obsahuje přehled modulu runtime souběžnosti.Popisuje výhody modulu Runtime souběžnosti, kdy ji použít, a způsob jeho součástí interakce mezi sebou navzájem a s operačním systémem a aplikacemi.
Oddíly
Tento dokument obsahuje následující oddíly:
Proč je rozhraní Concurrency Runtime důležité
Architektura
Výrazy lambda v jazyce C++
Požadavky
Proč je rozhraní Concurrency Runtime důležité
Runtime pro souběžnosti poskytuje jednotné a předvídatelnost aplikací a komponent aplikace, které běží současně.Jsou dva příklady z výhod Concurrency Runtime plánování společných úkolů a spolupráce blokování.
Spolupráce Plánovač, která implementuje algoritmus krást práci pro efektivní rozdělení práce mezi výpočetní prostředky používá modul Runtime souběžnosti.Příkladem je aplikace, která má dvě podprocesů, které jsou spravovány modulem runtime stejné.Pokud jeden podproces dokončí jeho naplánované úlohy, jej může převzít práci z jiného vlákna.Tento mechanismus zůstatky celkové zatížení aplikace.
Concurrency Runtime poskytuje také primitivní synchronizace, které synchronizovat přístup k prostředkům pomocí blokování spolupráce.Zvažte například úkol, který musí mít výhradní přístup ke sdílenému prostředku.Blokování kooperativně, modul runtime pomocí zbývajících quantum provést jiný úkol, protože první úkol čeká prostředek.Tento mechanismus podporuje maximální využití výpočetních prostředků.
[Nahoře]
Architektura
Modul Runtime souběžnosti je rozdělen na čtyři komponenty: paralelní knihovnu vzorků (PPL), asynchronní knihovny agentů, Plánovač úloh a správce prostředků.Tyto součásti jsou umístěny mezi operačním systémem a aplikacemi.Následující ilustrace znázorňuje interakci Concurrency Runtime součásti operačního systému a aplikací:
Architektura souběžnosti za běhu
Důležité |
---|
Součásti Plánovač úloh a správce prostředků nejsou k dispozici Windows Store app. |
Modul Runtime souběžnosti je vysoce rozšiřitelných, to znamená, že můžete kombinovat existující funkce více.Concurrency Runtime vytvoří mnoho funkcí, jako je paralelní algoritmy, z nižší úrovně komponent.
Concurrency Runtime poskytuje také primitivní synchronizace, které synchronizovat přístup k prostředkům pomocí blokování spolupráce.Další informace o těchto primitivní synchronizace, viz Synchronizační datové struktury.
V následujících částech naleznete stručný přehled co nabízí jednotlivé komponenty a kdy ji použít.
Knihovna PPL (Parallel Patterns Library)
Paralelní knihovnu vzorků (PPL) poskytuje univerzální kontejnery a algoritmy pro provádění podrobného paralelismu.Umožňuje PPL imperativní datový paralelismus tím, že poskytuje paralelní algoritmy distribuování výpočty kolekce nebo sady dat v počítačové prostředky.Umožňuje také paralelismus tím, že poskytuje objekty úloh, které rozmístit více nezávislých operací přes výpočetní prostředky.
Používejte paralelní knihovnu vzorků mají místní výpočtu, které mohou mít prospěch z paralelního spuštění.Například můžete použít concurrency::parallel_for algoritmu pro převod existujícího for jednat v paralelní smyčky.
Další informace o knihovně paralelní vzorky, viz Knihovna PPL (Parallel Patterns Library).
Knihovna asynchronních agentů
Asynchronní knihovny agentů (nebo jen Knihovny agentů) poskytuje i programovací model založený na herce a zprávu předá rozhraní pro hrubý tok dat a úkoly kanálů.Asynchronní zástupci umožňují provést produktivní využití čekací doba, s provedením práce jako ostatní součásti čekat na data.
Pokud máte více entit, které vzájemně komunikovat asynchronně, použijte knihovny agentů.Můžete například vytvořit agenta, který načte data ze souboru nebo síťové připojení a potom pomocí předávání rozhraní zpráv k odeslání dat do jiného agenta.
Další informace o knihovně agenti, viz Knihovna asynchronních agentů.
Plánovač úloh
Plánovač úloh, plánuje a koordinuje úkoly v době běhu.Služba Plánovač úloh je spolupráce a používá algoritmus krást práci pro dosažení maximální využití prostředků zpracování.
Concurrency Runtime poskytuje výchozí plánovač, takže není nutné spravovat podrobnosti infrastruktury.Nicméně kvalita potřebám vaší aplikace, můžete zadat také vlastní plánování zásad nebo přidružit konkrétní plánovače k jednotlivým úkolům.
Další informace o službě Plánovač úloh naleznete v tématu Plánovač úloh (Concurrency Runtime).
Správce prostředků
Role správce prostředků je Správa výpočetních prostředků, například procesory a paměť.Správce prostředků odpovídá zatížení přiřazením zdrojů, kde může být nejúčinnější změnit za běhu.
Správce prostředků slouží jako abstrakcí přes výpočetních prostředků a především spolupracuje s Plánovačem úloh.Přestože správce prostředků lze použít k optimalizaci výkonu knihoven a aplikací, obvykle pomocí funkce poskytované paralelní vzorky knihovny, knihovny agentů a Plánovač úloh.Tyto knihovny dynamicky vyrovnání zdrojů, jak změnit pracovní vytížení pomocí Správce prostředků.
[Nahoře]
Výrazy lambda v jazyce C++
Mnoho typů a algoritmy, které jsou definovány Concurrency Runtime jsou implementovány jako šablony jazyka C++.Některé z těchto typů a algoritmy brát jako parametr rutiny, která vykonává práci.Tento parametr může být lambda funkce, funkce objektu nebo ukazatele na funkci.Tyto entity jsou také označovány jako pracovní funkce nebo pracovní rutiny.
Lambda výrazy jsou důležitou novou funkcí jazyka Visual C++, protože poskytují stručné způsob, jak definovat pracovní funkce pro paralelní zpracování.Objekty funkce a funkce ukazatele umožňují pomocí existujícího kódu modulu Runtime souběžnosti.Doporučujeme však použít lambda výrazy při psaní nového kódu z důvodu bezpečnosti a produktivity výhod, které poskytují.
Následující příklad porovnává syntaxe lambda funkce, funkce objektů a ukazatelů funkcí ve více voláních concurrency::parallel_for_each algoritmu.Každé volání parallel_for_each používá k výpočtu čtverců jednotlivých prvků v odlišné techniky std::array objektu.
// comparing-work-functions.cpp
// compile with: /EHsc
#include <ppl.h>
#include <array>
#include <iostream>
using namespace concurrency;
using namespace std;
// Function object (functor) class that computes the square of its input.
template<class Ty>
class SquareFunctor
{
public:
void operator()(Ty& n) const
{
n *= n;
}
};
// Function that computes the square of its input.
template<class Ty>
void square_function(Ty& n)
{
n *= n;
}
int wmain()
{
// Create an array object that contains 5 values.
array<int, 5> values = { 1, 2, 3, 4, 5 };
// Use a lambda function, a function object, and a function pointer to
// compute the square of each element of the array in parallel.
// Use a lambda function to square each element.
parallel_for_each(begin(values), end(values), [](int& n){n *= n;});
// Use a function object (functor) to square each element.
parallel_for_each(begin(values), end(values), SquareFunctor<int>());
// Use a function pointer to square each element.
parallel_for_each(begin(values), end(values), &square_function<int>);
// Print each element of the array to the console.
for_each(begin(values), end(values), [](int& n) {
wcout << n << endl;
});
}
Výsledek
Další informace o lambda funkce v jazyce C++ naleznete v tématu Výrazy lambda v jazyce C++.
[Nahoře]
Požadavky
Následující tabulka obsahuje soubory hlaviček, které jsou spojeny s každou součást Concurrency Runtime:
Součást |
Soubory hlaviček |
---|---|
Knihovna PPL (Parallel Patterns Library) |
ppl.h concurrent_queue.h concurrent_vector.h |
Knihovna asynchronních agentů |
Agents.h |
Plánovač úloh |
concrt.h |
Správce prostředků |
concrtrm.h |
Modul Runtime souběžnosti je deklarován v souběžnost obor názvů. (Můžete také použít souběžnost, což je alias pro tento obor názvů.) concurrency::details Framework Runtime souběžnosti podporuje obor názvů a není určen pro použití přímo z vašeho kódu.
Modul Runtime souběžnosti je dodáván jako součást C Runtime Library (CRT).Další informace o tom, jak vytvořit aplikaci, která používá CRT naleznete v tématu Funkce knihovny CRT.
[Nahoře]