Dela via


Schemaläggarinstanser

Det här dokumentet beskriver rollen för scheduler-instanser i concurrency Runtime och hur du använder samtidighet::Scheduler och samtidighet::CurrentScheduler-klasser för att skapa och hantera scheduler-instanser. Scheduler-instanser är användbara när du vill associera explicita schemaläggningsprinciper med specifika typer av arbetsbelastningar. Du kan till exempel skapa en scheduler-instans för att köra vissa uppgifter med en förhöjd trådprioritet och använda standardschemaläggaren för att köra andra uppgifter med normal trådprioritet.

Tips/Råd

Concurrency Runtime tillhandahåller en standardschemaläggare och därför behöver du inte skapa en i ditt program. Eftersom Schemaläggaren hjälper dig att finjustera prestanda för dina program rekommenderar vi att du börjar med PPL (Parallel Patterns Library) eller Asynchronous Agents Library om du är nybörjare på Concurrency Runtime.

Sektioner

Klasserna Scheduler och CurrentScheduler

Med Schemaläggaren kan program använda en eller flera schemaläggarinstanser för att schemalägga arbete. Klassen concurrency::Scheduler representerar en scheduler-instans och kapslar in de funktioner som är relaterade till schemaläggningsuppgifter.

En tråd som är kopplad till en schemaläggare kallas för en körningskontext, eller bara kontext. En schemaläggare kan vara aktiv i den aktuella kontexten när som helst. Den aktiva schemaläggaren kallas även för den aktuella schemaläggaren. Concurrency Runtime använder klassen concurrency::CurrentScheduler för att ge åtkomst till den aktuella schemaläggaren. Den aktuella schemaläggaren för en kontext kan skilja sig från den aktuella schemaläggaren för en annan kontext. Körtiden ger ingen representation av den aktuella schemaläggaren på processnivå.

Vanligtvis används den CurrentScheduler klassen för att komma åt den aktuella schemaläggaren. Klassen Scheduler är användbar när du behöver hantera en schemaläggare som inte är den aktuella.

I följande avsnitt beskrivs hur du skapar och hanterar en scheduler-instans. Ett fullständigt exempel som illustrerar dessa uppgifter finns i Så här hanterar du en Scheduler-instans.

[Topp]

Skapa en Scheduler-instans

Det finns tre sätt att skapa ett Scheduler objekt:

  • Om det inte finns någon schemaläggare skapar körmiljön en standardschemaläggare för dig när du använder körmiljöns funktionalitet, till exempel en parallell algoritm, för att utföra uppgifter. Standardschemaläggaren blir den aktuella schemaläggaren för kontexten som initierar det parallella arbetet.

  • Metoden concurrency::CurrentScheduler::Create skapar ett Scheduler objekt som använder en specifik princip och associerar schemaläggaren med den aktuella kontexten.

  • Metoden concurrency::Scheduler::Create skapar ett Scheduler objekt som använder en specifik princip, men som inte associerar den med den aktuella kontexten.

Om man tillåter att programkörningen skapar en standardschemaläggare kan alla samtidiga uppgifter dela samma schemaläggare. Vanligtvis används de funktioner som tillhandahålls av PPL ( Parallel Patterns Library ) eller Asynchronous Agents Library för att utföra parallellt arbete. Därför behöver du inte arbeta direkt med schemaläggaren för att styra dess princip eller livslängd. När du använder PPL eller agentbiblioteket skapar körningen standardschemaläggaren om den inte finns och gör den till aktuell schemaläggare för varje kontext. När du skapar en schemaläggare och ställer in den som den aktuella schemaläggaren, använder körmiljön denna schemaläggare för att planera uppgifter. Skapa endast ytterligare scheduler-instanser när du behöver en specifik schemaläggningsprincip. Mer information om de principer som är associerade med en schemaläggare finns i Scheduler-principer.

[Topp]

Hantera livslängden för en Scheduler-instans

Körningen använder en referensräkningsmekanism för att styra objektens Scheduler livslängd.

När du använder metoden CurrentScheduler::Create eller metoden Scheduler::Create för att skapa ett objekt av typen Scheduler anger körningstiden det initiala referensantalet för schemaläggaren till ett. Körtidssystemet ökar referensantalet när du anropar metoden concurrency::Scheduler::Attach. Metoden Scheduler::Attach associerar Scheduler objektet med den aktuella kontexten. Detta gör den till aktuell schemaläggare. När du anropar CurrentScheduler::Create metoden skapar körningen både ett Scheduler objekt och kopplar det till den aktuella kontexten (och anger referensantalet till ett). Du kan också använda metoden concurrency::Scheduler::Reference för att öka referensantalet för ett Scheduler objekt.

Körningen minskar referensantalet när du anropar metoden concurrency::CurrentScheduler::Detach för att koppla från den aktuella schemaläggaren eller concurrency::Scheduler::Release. När referensantalet når noll, förstörs Scheduler-objektet av körningen efter att alla schemalagda aktiviteter har slutförts. En aktivitet som körs kan öka referensantalet för den aktuella schemaläggaren. Om referensantalet därför når noll och en aktivitet ökar referensantalet förstör Scheduler körningen inte objektet förrän referensantalet når noll igen och alla aktiviteter har slutförts.

Programkörningen underhåller en intern stack med Scheduler objekt för varje enskild kontext. När du anropar Scheduler::Attach metoden eller CurrentScheduler::Create skickar körningen objektet Scheduler till stacken för den aktuella kontexten. Detta gör den till aktuell schemaläggare. När du anropar CurrentScheduler::Detach, tar körningen bort den aktuella schemaläggaren från stacken och ställer in den tidigare som den nuvarande schemaläggaren i den aktuella kontexten.

Körmiljön erbjuder flera sätt att hantera livslängden för en scheduler-instans. I följande tabell visas den lämpliga metoden som frigör eller lösgör schemaläggaren från den aktuella kontexten, för varje metod som skapar eller binder en schemaläggare till den aktuella kontexten.

Skapa eller koppla metod Frisläpp eller koppla från metod
CurrentScheduler::Create CurrentScheduler::Detach
Scheduler::Create Scheduler::Release
Scheduler::Attach CurrentScheduler::Detach
Scheduler::Reference Scheduler::Release

Om du anropar en olämplig frigörings- eller frånkopplingsmetod kan det orsaka ospecificerat beteende i körmiljön.

När du använder funktionalitet, till exempel PPL, som gör att körtiden skapar standardschemaläggaren för dig, ska du inte frisläppa eller koppla från den här schemaläggaren. Körmiljön hanterar livslängden för alla schemaläggare den skapar.

Eftersom körningen inte förstör ett Scheduler-objekt innan alla aktiviteter har avslutats, kan du använda metoderna concurrency::Scheduler::RegisterShutdownEvent eller concurrency::CurrentScheduler::RegisterShutdownEvent för att få ett meddelande när ett Scheduler-objekt förstörs. Detta är användbart när du måste vänta tills varje uppgift som schemalagts av ett Scheduler objekt ska slutföras.

[Topp]

Metoder och funktioner

I det här avsnittet sammanfattas de viktiga metoderna för klasserna CurrentScheduler och Scheduler .

Tänk på CurrentScheduler klassen som en hjälp för att skapa en schemaläggare för användning i den aktuella kontexten. Med Scheduler klassen kan du styra en schemaläggare som tillhör en annan kontext.

I följande tabell visas de viktiga metoder som definieras av CurrentScheduler klassen.

Metod Beskrivning
Skapa Skapar ett Scheduler objekt som använder den angivna principen och associerar den med den aktuella kontexten.
Hämta Hämtar en pekare till objektet Scheduler som är associerat med den aktuella kontexten. Den här metoden ökar inte referensantalet för Scheduler objektet.
Koppla från Kopplar bort den aktuella schemaläggaren från den aktuella kontexten och anger den tidigare som aktuell schemaläggare.
RegisterShutdownEvent Registrerar en händelse som körmiljön anger när den aktuella schemaläggaren avslutas.
SkapaSchemagrupp Skapar ett concurrency::ScheduleGroup-objekt i den aktuella schemaläggaren.
ScheduleTask Lägger till en lätt uppgift i schemaläggningskön för den aktuella schemaläggaren.
GetPolicy Hämtar en kopia av policyn som är kopplad till den nuvarande schemaläggaren.

I följande tabell visas de viktiga metoder som definieras av Scheduler klassen.

Metod Beskrivning
Skapa Skapar ett Scheduler objekt som använder den angivna principen.
Bifoga Associerar Scheduler objektet med den aktuella kontexten.
Referens Ökar referensräknaren för Scheduler objektet.
Släppa Minskar referensräknaren för Scheduler objektet.
RegisterShutdownEvent Registrerar en händelse som initieras av programkörningen när Scheduler-objektet förstörs.
SkapaSchemagrupp Skapar ett samtidighetsobjekt::ScheduleGroup-objekt i objektet Scheduler .
ScheduleTask Schemalägger en lätt uppgift från objektet Scheduler .
GetPolicy Hämtar en kopia av policyn som är associerad med Scheduler objektet.
SetDefaultSchedulerPolicy Ställer in policyn för körtiden att använda när den skapar standardschemaläggaren.
ÅterställStandardSchemaläggningspolicy Återställer standardpolicyn till den som var aktiv innan anropet till SetDefaultSchedulerPolicy. Om standardschemaläggaren skapas efter det här anropet använder körningen standardprincipinställningar för att skapa schemaläggaren.

[Topp]

Exempel

Grundläggande exempel på hur du skapar och hanterar en scheduler-instans finns i Så här hanterar du en Scheduler-instans.

Se även

Aktivitetsschemaläggare
Anvisningar: Hantera en schemaläggarinstans
Schemaläggarprinciper
Schemalägg grupper