Delen via


Overzicht van de Concurrency Runtime

Dit document biedt een overzicht van de Concurrency Runtime. Hierin worden de voordelen van de Gelijktijdigheidsruntime beschreven, wanneer deze moet worden gebruikt en hoe de onderdelen met elkaar en met het besturingssysteem en toepassingen communiceren.

Afdelingen

Dit document bevat de volgende secties:

Geschiedenis van de implementatie van de Concurrency Runtime

In Visual Studio 2010 tot en met 2013 is de Gelijktijdigheidsruntime opgenomen in msvcr100.dll via msvcr120.dll. Toen de UCRT-herstructurering plaatsvond in Visual Studio 2015, werd dat DLL in drie delen geherstructureerd:

  • ucrtbase.dll – C API, geleverd in Windows 10 en onderhouden voor oudere versies via Windows Update.

  • vcruntime140.dll : compilerondersteuningsfuncties en EH-runtime, verzonden via Visual Studio

  • concrt140.dll: Gelijktijdigheidsruntime, verzonden via Visual Studio. Vereist voor parallelle containers en algoritmen, zoals concurrency::parallel_for. Bovendien vereist de STL dit DLL-bestand in Windows XP om primitieven voor stroomsynchronisatie te activeren, omdat Windows XP geen voorwaardevariabelen heeft.

In Visual Studio 2015 en hoger is de Concurrenceruntime-taakplanner niet langer de planner voor de taakklasse en gerelateerde typen in ppltasks.h. Deze typen gebruiken nu de Windows ThreadPool voor betere prestaties en interoperabiliteit met Windows-synchronisatieprimitief.

Waarom een runtime voor gelijktijdigheid belangrijk is

Een runtime voor gelijktijdigheid biedt uniformiteit en voorspelbaarheid voor toepassingen en toepassingsonderdelen die tegelijkertijd worden uitgevoerd. Twee voorbeelden van de voordelen van de Gelijktijdigheidsruntime zijn het plannen van coöperatieve taken en het blokkeren van coöperaties.

De Gelijktijdigheidsruntime maakt gebruik van een coöperatieve taakplanner waarmee een algoritme voor werk stelen wordt geïmplementeerd om werk efficiënt te verdelen over rekenresources. Denk bijvoorbeeld aan een toepassing met twee threads die beide worden beheerd door dezelfde runtime. Als één thread de geplande taak heeft voltooid, kan deze het werk van de andere thread offloaden. Met dit mechanisme wordt de totale workload van de toepassing in balans.

De Gelijktijdigheidsruntime biedt ook synchronisatieprimitieven die gebruikmaken van coöperatieve blokkeringen voor het synchroniseren van de toegang tot resources. Denk bijvoorbeeld aan een taak die exclusieve toegang tot een gedeelde resource moet hebben. Door coöperatief te blokkeren, kan de runtime het resterende kwantum gebruiken om een andere taak uit te voeren wanneer de eerste taak wacht op de resource. Dit mechanisme bevordert het maximale gebruik van rekenresources.

[Boven]

Architectuur

De Gelijktijdigheidsruntime is onderverdeeld in vier onderdelen: de Parallel Patterns Library (PPL), de Asynchrone Agents-bibliotheek, de Taakplanner en de Resource Manager. Deze onderdelen bevinden zich tussen het besturingssysteem en de toepassingen. In de volgende afbeelding ziet u hoe de gelijktijdigheidsruntime-onderdelen communiceren tussen het besturingssysteem en de toepassingen:

Runtimearchitectuur voor gelijktijdigheid

De gelijktijdigheidsruntimearchitectuur.

Belangrijk

De onderdelen van Task Scheduler en Resource Manager zijn niet beschikbaar via een UWP-app (Universal Windows Platform) of wanneer u de taakklasse of andere typen in ppltasks.h gebruikt.

De Concurrency Runtime is zeer samenstelbaar, dat wil gezegd, u kunt bestaande functionaliteit combineren om meer te doen. De Gelijktijdigheidsruntime bevat veel functies, zoals parallelle algoritmen, van onderdelen op lager niveau.

De Gelijktijdigheidsruntime biedt ook synchronisatieprimitieven die gebruikmaken van coöperatieve blokkeringen voor het synchroniseren van de toegang tot resources. Zie Synchronisatiegegevensstructuren voor meer informatie over deze synchronisatieprimitief.

In de volgende secties vindt u een kort overzicht van wat elk onderdeel biedt en wanneer u dit kunt gebruiken.

Bibliotheek met parallelle patronen

De PPL (Parallel Patterns Library) biedt containers en algoritmen voor algemeen gebruik voor het uitvoeren van fijnmazige parallelle uitvoering. De PPL maakt imperatieve gegevensparallelisme mogelijk door parallelle algoritmen te bieden die berekeningen over verzamelingen of op sets met gegevens over computerresources verdelen. Het maakt ook parallelle uitvoering van taken mogelijk door taakobjecten te bieden die meerdere onafhankelijke bewerkingen verdelen over rekenresources.

Gebruik de bibliotheek parallelle patronen wanneer u een lokale berekening hebt die kan profiteren van parallelle uitvoering. U kunt bijvoorbeeld het concurrency::parallel_for-algoritme gebruiken om een bestaande for lus te transformeren zodat deze parallel verloopt.

Zie PPL (Parallel Patterns Library) voor meer informatie over de bibliotheek voor parallelle patronen.

Bibliotheek met asynchrone agents

De Asynchrone agentsbibliotheek (of alleen agentsbibliotheek) biedt zowel een programmeermodel op basis van actor als berichtdoorgifteinterfaces voor grofkorrelige gegevensstroom- en pipeliningtaken. Met asynchrone agents kunt u productief gebruik maken van latentie door werk uit te voeren terwijl andere onderdelen wachten op gegevens.

Gebruik de agentsbibliotheek wanneer u meerdere entiteiten hebt die asynchroon met elkaar communiceren. U kunt bijvoorbeeld een agent maken waarmee gegevens worden gelezen uit een bestand of netwerkverbinding en vervolgens de berichtdoorgifteinterfaces worden gebruikt om die gegevens naar een andere agent te verzenden.

Zie de Asynchrone Agents-bibliotheek voor meer informatie over de Agents Library.

Taakplanner

De Task Scheduler plant en coördineert taken tijdens runtime. De Task Scheduler is coöperatief en maakt gebruik van een algoritme voor werk stelen om het maximale gebruik van verwerkingsbronnen te bereiken.

De Gelijktijdigheidsruntime biedt een standaardplanner, zodat u geen infrastructuurdetails hoeft te beheren. Als u echter wilt voldoen aan de kwaliteitsbehoeften van uw toepassing, kunt u ook uw eigen planningsbeleid opgeven of specifieke planners koppelen aan specifieke taken.

Zie Task Scheduler voor meer informatie over de Task Scheduler.

Resourcebeheerder

De rol van Resource Manager is het beheren van rekenresources, zoals processors en geheugen. Resource Manager reageert op workloads wanneer deze tijdens runtime worden gewijzigd door resources toe te wijzen aan waar ze het effectiefst kunnen zijn.

Resource Manager fungeert als abstractie van computingresources en communiceert voornamelijk met de Task Scheduler. Hoewel u de Resource Manager kunt gebruiken om de prestaties van uw bibliotheken en toepassingen af te stemmen, gebruikt u doorgaans de functionaliteit die wordt geleverd door de Parallel Patterns Library, de Agentsbibliotheek en de Taakplanner. Deze bibliotheken gebruiken Resource Manager om resources dynamisch opnieuw te verdelen wanneer workloads veranderen.

[Boven]

C++ Lambda-expressies

Veel van de typen en algoritmen die zijn gedefinieerd door de Gelijktijdigheidsruntime, worden geïmplementeerd als C++-sjablonen. Sommige van deze typen en algoritmen nemen als parameter een routine op die werk uitvoert. Deze parameter kan een lambda-functie, een functieobject of een functiepointer zijn. Deze entiteiten worden ook wel werkfuncties of werkroutines genoemd.

Lambda-expressies zijn een belangrijke nieuwe visual C++-taalfunctie omdat ze een beknopte manier bieden om werkfuncties te definiëren voor parallelle verwerking. Met functieobjecten en functiepointers kunt u de Gelijktijdigheidsruntime gebruiken met uw bestaande code. We raden u echter aan lambda-expressies te gebruiken wanneer u nieuwe code schrijft vanwege de voordelen voor veiligheid en productiviteit die ze bieden.

In het volgende voorbeeld worden de syntaxis van lambda-functies, functieobjecten en functiewijzers vergeleken in meerdere aanroepen van het concurrency::parallel_for_each-algoritme. Elke aanroep van parallel_for_each gebruikt een andere techniek om het kwadraat van elk element in een std::array object te berekenen.

// 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;
   });
}

Uitvoer

1
256
6561
65536
390625

Zie Lambda-expressies voor meer informatie over lambdafuncties in C++.

[Boven]

Behoeften

In de volgende tabel ziet u de headerbestanden die zijn gekoppeld aan elk onderdeel van de Gelijktijdigheidsruntime:

Onderdeel Header-bestanden
Parallel Patterns Library (PPL) ppl.h

concurrent_queue.h

concurrent_vector.h
Bibliotheek met asynchrone agents agents.h
Taakplanner concrt.h
Resourcebeheerder concrtrm.h

De Gelijktijdigheidsruntime wordt gedeclareerd in de naamruimte Gelijktijdigheid . (U kunt ook gelijktijdigheid gebruiken. Dit is een alias voor deze naamruimte.) De concurrency::details naamruimte ondersteunt het Framework concurrency Runtime en is niet bedoeld om rechtstreeks vanuit uw code te worden gebruikt.

De Concurrency Runtime is onderdeel van de C Runtime Library (CRT). Zie CRT-bibliotheekfuncties voor meer informatie over het bouwen van een toepassing die gebruikmaakt van crt.

[Boven]