Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här dokumentet beskriver rollen för scheduler-principer i Concurrency Runtime. En scheduler-princip styr den strategi som schemaläggaren använder när den hanterar uppgifter. Du kan till exempel överväga ett program som kräver att vissa uppgifter körs på THREAD_PRIORITY_NORMAL och andra uppgifter som ska köras på THREAD_PRIORITY_HIGHEST. Du kan skapa två scheduler-instanser: en som anger vilken ContextPriority princip som ska vara THREAD_PRIORITY_NORMAL och en annan som anger samma princip som THREAD_PRIORITY_HIGHEST.
Genom att använda scheduler-principer kan du dela upp tillgängliga bearbetningsresurser och tilldela en fast uppsättning resurser till varje schemaläggare. Tänk dig till exempel en parallell algoritm som inte skalas längre än fyra processorer. Du kan skapa en scheduler-princip som begränsar dess aktiviteter så att de inte använder fler än fyra processorer samtidigt.
Tips/Råd
Concurrency Runtime tillhandahåller en standardschemaläggare. Därför behöver du inte skapa någon 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.
När du använder concurrency::CurrentScheduler::Create, concurrency::Scheduler::Create eller concurrency::Scheduler::SetDefaultSchedulerPolicy metoder för att skapa en schemaläggarexemplar, tillhandahåller du ett concurrency::SchedulerPolicy objekt som innehåller en samling av nyckel-värdepar som specificerar schemaläggarens beteende. Konstruktorn SchedulerPolicy tar ett variabelt antal argument. Det första argumentet är antalet principelement som du ska ange. De återstående argumenten är nyckel/värde-par för varje principelement. I följande exempel skapas ett SchedulerPolicy objekt som anger tre principelement. Körtiden använder standardvärden för de policynycklar som inte har angetts.
SchedulerPolicy policy(3,
MinConcurrency, 2,
MaxConcurrency, 4,
ContextPriority, THREAD_PRIORITY_HIGHEST
);
Uppräkningen concurrency::PolicyElementKey definierar de principnycklar som är associerade med uppgiftsschemaläggaren. I följande tabell beskrivs principnycklarna och standardvärdet som körmiljön använder för var och en av dem.
| Policynyckel | Beskrivning | Standardvärde |
|---|---|---|
SchedulerKind |
Ett samtidighetsvärde::SchedulerType som anger vilken typ av trådar som ska användas för att schemalägga aktiviteter. |
ThreadScheduler (använd normala trådar). Det här är det enda giltiga värdet för den här nyckeln. |
MaxConcurrency |
Ett unsigned int värde som anger det maximala antalet samtidighetsresurser som schemaläggaren använder. |
concurrency::MaxExecutionResources |
MinConcurrency |
Ett unsigned int värde som anger det minsta antalet samtidighetsresurser som schemaläggaren använder. |
1 |
TargetOversubscriptionFactor |
Ett unsigned int värde som anger hur många trådar som ska allokeras till varje bearbetningsresurs. |
1 |
LocalContextCacheSize |
Ett unsigned int värde som anger det maximala antalet kontexter som kan cachelagras i den lokala kön för varje virtuell processor. |
8 |
ContextStackSize |
Ett unsigned int värde som anger storleken på stacken, i kilobyte, som ska reserveras för varje kontext. |
0 (använd standardstackens storlek) |
ContextPriority |
Ett int värde som anger trådprioriteten för varje kontext. Det kan vara valfritt värde som du kan skicka till SetThreadPriority eller INHERIT_THREAD_PRIORITY. |
THREAD_PRIORITY_NORMAL |
SchedulingProtocol |
Ett samtidighetsvärde::SchedulingProtocolType som anger vilken schemaläggningsalgoritm som ska användas. | EnhanceScheduleGroupLocality |
DynamicProgressFeedback |
Ett concurrency::D ynamicProgressFeedbackType-värde som anger om resurserna ska balanseras om enligt statistikbaserad förloppsinformation. Observera Ställ inte in den här policyn på ProgressFeedbackDisabled eftersom den är reserverad för körningen att använda. |
ProgressFeedbackEnabled |
Varje schemaläggare använder sin egen princip när den schemalägger uppgifter. De principer som är associerade med en schemaläggare påverkar inte beteendet för någon annan schemaläggare. Dessutom kan du inte ändra scheduler-principen när du har skapat Scheduler objektet.
Viktigt!
Använd endast scheduler-principer för att styra attributen för trådar som körningen skapar. Ändra inte trådtillhörigheten eller prioriteten för trådar som skapas av körtiden eftersom det kan leda till oförutsägbart beteende.
Körningstiden skapar en standardschemaläggare åt dig om du inte själv skapar en. Om du vill använda standardschemaläggaren i ditt program, men vill ange en princip som schemaläggaren ska använda, anropar du metoden concurrency::Scheduler::SetDefaultSchedulerPolicy innan du schemalägger parallellt arbete. Om du inte anropar metoden Scheduler::SetDefaultSchedulerPolicy använder körtiden de standardprincipvärdena från tabellen.
Använd metoderna concurrency::CurrentScheduler::GetPolicy och concurrency::Scheduler::GetPolicy för att hämta en kopia av schemapolicyn. De principvärden som du får från dessa metoder kan skilja sig från de principvärden som du anger när du skapar schemaläggaren.
Exempel
Om du vill undersöka exempel som använder specifika scheduler-principer för att styra beteendet för schemaläggaren läser du Så här: Ange specifika scheduler-principer och Så här skapar du agenter som använder specifika scheduler-principer.
Se även
Aktivitetsschemaläggare
Så här anger du specifika schemaläggningsprinciper
Anvisningar: Skapa agenter som använder specifika scheduler-principer