Eşitleme Veri Yapılarını Windows API ile Karşılaştırma

Bu konu, Eşzamanlılık Çalışma Zamanı tarafından sağlanan eşitleme veri yapılarının davranışını Windows API tarafından sağlananlarla karşılaştırır.

Eşzamanlılık Çalışma Zamanı tarafından sağlanan eşitleme veri yapıları, işbirliğine dayalı iş parçacığı oluşturma modelini izler. İşbirliğine dayalı iş parçacığı oluşturma modelinde eşitleme ilkelleri, işlem kaynaklarını açıkça diğer iş parçacıklarına verir. Bu, işleme kaynaklarının denetim zamanlayıcı veya işletim sistemi tarafından diğer iş parçacıklarına aktarıldığı önleyici iş parçacığı modelinden farklıdır.

critical_section

concurrency::critical_section sınıfı, yalnızca bir işlemin iş parçacıkları tarafından kullanılabildiğinden Windows CRITICAL_SECTION yapısına benzer. Windows API'sindeki kritik bölümler hakkında daha fazla bilgi için bkz . Kritik Bölüm Nesneleri.

reader_writer_lock

concurrency::reader_writer_lock sınıfı, Windows ince okuyucu/yazıcı (SRW) kilitlerine benzer. Aşağıdaki tabloda benzerlikler ve farklılıklar açıklanmaktadır.

Özellik reader_writer_lock sınıfı SRW kilidi
Yeniden giriş olmayan Yes Yes
Okuyucuları yazıcıya yükseltebilir (yükseltme desteği) Hayır Hayır
Bir yazarı okuyucuya indirgeyebilir (desteği düşürebilir) Hayır Hayır
Yazma tercih kilidi Yes Hayır
Yazarlara FIFO erişimi Yes Hayır

SRW kilitleri hakkında daha fazla bilgi için bkz . Platform SDK'sında İnce Okuyucu/Yazıcı (SRW) Kilitleri .

event

concurrency::event sınıfı, adlandırılmamış bir Windows el ile sıfırlama olayına benzer. Bununla birlikte, bir event nesne işbirliği içinde davranırken, Windows olayı önleyici davranır. Windows olayları hakkında daha fazla bilgi için bkz . Olay Nesneleri.

Örnek

Açıklama

Sınıfı ile Windows olayları arasındaki event farkı daha iyi anlamak için aşağıdaki örneği göz önünde bulundurun. Bu örnek, zamanlayıcının en fazla iki eşzamanlı görev oluşturmasına olanak tanır ve ardından sınıfını ve Bir Windows el ile sıfırlama olayını kullanan event iki benzer işlevi çağırır. Her işlev önce paylaşılan bir olayın işaretlenmesini bekleyen birkaç görev oluşturur. Ardından her işlev çalışan görevlere teslim olur ve ardından olaya sinyal gönderir. Ardından her işlev sinyalli olayı bekler.

Kod

// event-comparison.cpp
// compile with: /EHsc
#include <windows.h>
#include <concrtrm.h>
#include <ppl.h>
#include <iostream>
#include <sstream>

using namespace concurrency;
using namespace std;

// Demonstrates the usage of cooperative events.
void RunCooperativeEvents()
{
   // An event object.
   event e;

   // Create a task group and execute five tasks that wait for
   // the event to be set.
   task_group tasks;
   for (int i = 0; i < 5; ++i)
   {
      tasks.run([&] {
         // Print a message before waiting on the event.
         wstringstream ss;
         ss << L"\t\tContext " << GetExecutionContextId() 
            << L": waiting on an event." << endl; 
         wcout << ss.str();

         // Wait for the event to be set.
         e.wait();

         // Print a message after the event is set.
         ss = wstringstream();
         ss << L"\t\tContext " << GetExecutionContextId() 
            << L": received the event." << endl; 
         wcout << ss.str();
      });
   }

   // Wait a sufficient amount of time for all tasks to enter 
   // the waiting state.
   Sleep(1000L);

   // Set the event.

   wstringstream ss;
   ss << L"\tSetting the event." << endl; 
   wcout << ss.str();

   e.set();

   // Wait for all tasks to complete.
   tasks.wait();
}

// Demonstrates the usage of preemptive events.
void RunWindowsEvents()
{
   // A Windows event object.
   HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, TEXT("Windows Event"));

   // Create a task group and execute five tasks that wait for
   // the event to be set.
   task_group tasks;
   for (int i = 0; i < 5; ++i)
   {
      tasks.run([&] {
         // Print a message before waiting on the event.
         wstringstream ss;
         ss << L"\t\tContext " << GetExecutionContextId() 
            << L": waiting on an event." << endl; 
         wcout << ss.str();

         // Wait for the event to be set.
         WaitForSingleObject(hEvent, INFINITE);

         // Print a message after the event is set.
         ss = wstringstream();
         ss << L"\t\tContext " << GetExecutionContextId() 
            << L": received the event." << endl; 
         wcout << ss.str();
      });
   }

   // Wait a sufficient amount of time for all tasks to enter 
   // the waiting state.
   Sleep(1000L);

   // Set the event.

   wstringstream ss;
   ss << L"\tSetting the event." << endl; 
   wcout << ss.str();

   SetEvent(hEvent);

   // Wait for all tasks to complete.
   tasks.wait();

   // Close the event handle.
   CloseHandle(hEvent);
}

int wmain()
{
   // Create a scheduler policy that allows up to two 
   // simultaneous tasks.
   SchedulerPolicy policy(1, MaxConcurrency, 2);

   // Attach the policy to the current scheduler.
   CurrentScheduler::Create(policy);
   
   wcout << L"Cooperative event:" << endl;
   RunCooperativeEvents();

   wcout << L"Windows event:" << endl;
   RunWindowsEvents();
}

Açıklamalar

Bu örnek aşağıdaki örnek çıkışı oluşturur:

Cooperative event:
    Context 0: waiting on an event.
    Context 1: waiting on an event.
    Context 2: waiting on an event.
    Context 3: waiting on an event.
    Context 4: waiting on an event.
    Setting the event.
    Context 5: received the event.
    Context 6: received the event.
    Context 7: received the event.
    Context 8: received the event.
    Context 9: received the event.
Windows event:
    Context 10: waiting on an event.
    Context 11: waiting on an event.
    Setting the event.
    Context 12: received the event.
    Context 14: waiting on an event.
    Context 15: received the event.
    Context 16: waiting on an event.
    Context 17: received the event.
    Context 18: waiting on an event.
    Context 19: received the event.
    Context 13: received the event.

event Sınıf işbirliği içinde davrandığından zamanlayıcı, bir olay sinyalli duruma girmeyi beklerken işleme kaynaklarını başka bir bağlama yeniden dağıtabilir. Bu nedenle, sınıfını kullanan event sürüm tarafından daha fazla iş gerçekleştirilir. Windows olaylarını kullanan sürümde, sonraki görev başlatılmadan önce bekleyen her görevin sinyal durumunu girmesi gerekir.

Görevler hakkında daha fazla bilgi için bkz . Görev Paralelliği.

Ayrıca bkz.

Eşitleme Veri Yapıları