Aracılığıyla paylaş


Nasıl yapılır: belirli Zamanlayıcı ilkeler belirleme

Zamanlayıcı ilkeleri Zamanlayıcısı görevleri yönetir, kullandığı stratejisi denetlemenize olanak verir. Bu konuda bir Zamanlayıcı İlkesi yazdırır konsol için ilerleme durumu göstergesi görev iş parçacığının önceliğini artırmak için nasıl kullanılacağını gösterir.

Özel Zamanlayıcı ilkeleriyle birlikte zaman uyumsuz aracıları kullanan bir örnek için bkz: Nasıl yapılır: belirli Zamanlayıcı ilkeleri kullanan aracıları oluşturma.

Örnek

Aşağıdaki örnek, paralel iki görevleri gerçekleştirir. N ilk görev hesaplarth Fibonacci sayı. İkinci görev ilerleme durumu göstergesi konsolda yazdırılır.

İlk görevi yinelemeli decomposition Fibonacci sayısını hesaplamak için kullanır. Yani, her görevi yinelemeli olarak genel sonucu hesaplamak için alt görevleri oluşturur. Özyinelemeli decomposition kullanan görev kullanılabilen tüm kaynakları kullanmak ve böylece diğer görevleri starve. Bu örnekte, ilerleme durumu göstergesi baskı görev zamanında bilgi işlem kaynaklarına erişimi alamayabilir.

Bu örnek bir ilerleme ileti adil bilgi işlem kaynaklarına erişimi baskı görev sağlamak için açıklanan adımları kullanır Nasıl yapılır: bir Zamanlayıcı örneğini yönetmek özel bir ilke bir Zamanlayıcı örneğini oluşturmak için. Özel ilke en yüksek öncelik sınıfı için iş parçacığı önceliği belirtir.

Bu örnek concurrency::call ve concurrency::timer ilerleme göstergesi yazdırmak için sınıflar. Bu sınıflar başvuru yapması kendi Kurucular sürümleri olan bir concurrency::Scheduler bunları zamanlar nesnesi. Örneğin Fibonacci sayı ve ilerleme göstergesi baskı görev zamanlama Zamanlayıcı örneği hesaplar görevi zamanlamak için varsayılan Zamanlayıcı kullanır.

Bu örnek bir özel ilke Zamanlayıcı kullanmanın yararları göstermek için iki kez genel görev yapar. Bu örnek, varsayılan Zamanlayıcı ilk hem görevleri zamanlamak için kullanır. Örnek daha sonra ilk görev zamanlamak için varsayılan Zamanlayıcı ve ikinci görev zamanlamak için özel bir ilke scheduler kullanır.

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

Bu örnek aşağıdaki çıktıyı üretir.

Default scheduler:
...........................................................................done
Scheduler that has a custom policy:
...........................................................................done

Her iki görevin aynı sonucu verir, ancak özel bir ilke kullanan sürüm daha responsively davranır yükseltilmiş bir öncelik sırasında çalıştırılacak ilerleme göstergesi yazdırır görevi etkinleştirir.

Kod Derleniyor

Örnek kodu kopyalayın ve Visual Studio Project'te yapıştırın veya adlı bir dosyaya yapıştırın Zamanlayıcı policy.cpp ve Visual Studio komut istemi penceresinde aşağıdaki komutu çalıştırın.

cl.exe /EHsc scheduler-policy.cpp

Ayrıca bkz.

Görevler

Nasıl yapılır: bir Zamanlayıcı örneğini yönetmek

Nasıl yapılır: belirli Zamanlayıcı ilkeleri kullanan aracıları oluşturma

Kavramlar

Zamanlayıcı ilkeleri