Jak: określić szczególne zasady harmonogram
Harmonogram zasady pozwalają określić strategii, która używa harmonogramu, podczas zarządzania zadaniami.W tym temacie przedstawiono sposób użycia zasad harmonogram zwiększenie priorytetu wątku zadania, które drukuje wskaźnik postępu w konsoli.
Przykładem używa zasady niestandardowy harmonogram wraz z agentów asynchronicznych, zobacz Jak: tworzenie czynników, które używają zasad szczególnych harmonogram.
Przykład
Poniższy przykład wykonuje zadania dwóch równolegle.Pierwsze zadanie oblicza ncz Fibonacciego.Drugie zadanie drukuje wskaźnik postępu w konsoli.
Pierwsze zadanie używa dekompozycji cyklicznych do wyliczenia liczby Fibonacciego.Oznacza to, że rekursywnie każdego zadania tworzy podzadania obliczyć wynik ogólny.Zadanie, które używa dekompozycji cykliczne może używać wszystkich dostępnych zasobów i tym samym uniemożliwić wykonywanie innych zadań.W tym przykładzie zadanie, które drukuje wskaźnik postępu może nie otrzymywać czas dostęp do zasobów obliczeniowych.
Aby zapewnić zadanie, które drukuje komunikat postępu sprawiedliwy dostęp do zasobów komputerowych, w tym przykładzie użyto kroków opisanych w Jak: Zarządzanie wystąpienie harmonogram do tworzenia instancji harmonogram, który ma niestandardowe zasady.Niestandardowe zasady określa priorytet wątku za najwyższy priorytet.
W tym przykładzie concurrency::call i concurrency::timer klasy drukowania wskaźnik zaawansowania.Te klasy mają wersje ich konstruktorów odniesienie do concurrency::Scheduler obiekt, który planuje je.W przykładzie użyto harmonogram domyślny, aby zaplanować zadanie, które oblicza liczbę Fibonacciego i wystąpienie harmonogram, aby zaplanować zadanie, które drukuje wskaźnik postępu.
Aby zilustrować korzyści wynikających z używania harmonogramu, który ma niestandardowe zasady, w tym przykładzie wykonuje zadanie ogólnej dwa razy.Harmonogram domyślny przykładzie najpierw do zaplanowania obu zadań.W przykładzie użyto następnie harmonogram domyślny do zaplanowania zadania pierwszego i harmonogramu, która ma zasadę niestandardową, aby zaplanować zadanie drugiego.
// scheduler-policy.cpp
// compile with: /EHsc
#include <windows.h>
#include <ppl.h>
#include <agents.h>
#include <iostream>
using namespace concurrency;
using namespace std;
// Computes the nth Fibonacci number.
// This function illustrates a lengthy operation and is therefore
// not optimized for performance.
int fibonacci(int n)
{
if (n < 2)
return n;
// Compute the components in parallel.
int n1, n2;
parallel_invoke(
[n,&n1] { n1 = fibonacci(n-1); },
[n,&n2] { n2 = fibonacci(n-2); }
);
return n1 + n2;
}
// Prints a progress indicator while computing the nth Fibonacci number.
void fibonacci_with_progress(Scheduler& progress_scheduler, int n)
{
// Use a task group to compute the Fibonacci number.
// The tasks in this group are scheduled by the current scheduler.
structured_task_group tasks;
auto task = make_task([n] {
fibonacci(n);
});
tasks.run(task);
// Create a call object that prints its input to the console.
// This example uses the provided scheduler to schedule the
// task that the call object performs.
call<wchar_t> c(progress_scheduler, [](wchar_t c) {
wcout << c;
});
// Connect the call object to a timer object. The timer object
// sends a progress message to the call object every 100 ms.
// This example also uses the provided scheduler to schedule the
// task that the timer object performs.
timer<wchar_t> t(progress_scheduler, 100, L'.', &c, true);
t.start();
// Wait for the task that computes the Fibonacci number to finish.
tasks.wait();
// Stop the timer.
t.stop();
wcout << L"done" << endl;
}
int wmain()
{
// Calculate the 38th Fibonacci number.
const int n = 38;
// Use the default scheduler to schedule the progress indicator while
// the Fibonacci number is calculated in the background.
wcout << L"Default scheduler:" << endl;
fibonacci_with_progress(*CurrentScheduler::Get(), n);
// Now use a scheduler that has a custom policy for the progress indicator.
// The custom policy specifies the thread priority to the highest
// priority class.
SchedulerPolicy policy(1, ContextPriority, THREAD_PRIORITY_HIGHEST);
Scheduler* scheduler = Scheduler::Create(policy);
// Register to be notified when the scheduler shuts down.
HANDLE hShutdownEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
scheduler->RegisterShutdownEvent(hShutdownEvent);
wcout << L"Scheduler that has a custom policy:" << endl;
fibonacci_with_progress(*scheduler, n);
// Release the final reference to the scheduler. This causes the scheduler
// to shut down.
scheduler->Release();
// Wait for the scheduler to shut down and destroy itself.
WaitForSingleObject(hShutdownEvent, INFINITE);
// Close the event handle.
CloseHandle(hShutdownEvent);
}
Ten przykład generuje następujące wyniki.
Default scheduler:
...........................................................................done
Scheduler that has a custom policy:
...........................................................................done
Chociaż oba zestawy zadań daje ten sam wynik, wersji, która używa niestandardowych zasad włącza zadanie, które drukuje wskaźnik postępu uruchamiane przy podwyższonym poziomie priorytetu, tak aby zachowuje się bardziej responsively.
Kompilowanie kodu
Skopiuj przykładowy kod i wklej go w projekcie programu Visual Studio lub wkleić go w pliku o nazwie harmonogramu policy.cpp , a następnie uruchom następujące polecenie w oknie wiersza polecenia usługi programu Visual Studio.
cl.exe /EHsc scheduler-policy.cpp
Zobacz też
Zadania
Jak: Zarządzanie wystąpienie harmonogram
Jak: tworzenie czynników, które używają zasad szczególnych harmonogram