Aracılığıyla paylaş


Windows API için eşitleme veri yapılarını karşılaştırma

Bu konu, Windows API'si tarafından sağlanan için eşzamanlılık çalışma zamanı tarafından sağlanan eşitleme veri yapılarını davranışı karşılaştırır.

Eşzamanlılık çalışma zamanı tarafından sağlanan eşitleme veri yapılarını izleyin işbirliği yapan iş parçacığı modeli.İşbirliği yapan iş parçacığı modeli eşitleme ilkel açıkça işleme kaynaklarını diğer parçacıkları verim.Bu farklılık gösteren preemptive iş parçacığı modeli, burada işlem kaynakları diğer iş denetleme Zamanlayıcı veya işletim sistemi tarafından aktarılır.

critical_section

Concurrency::critical_section class benzer Windows CRITICAL_SECTION yalnızca bir işlemin iş parçacıklarının tarafından kullanılabileceğinden yapısı.Kritik bölümlerde Windows API'si 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) kilitleri benzer.Aşağıdaki tabloda, benzerlikler ve farklar açıklanmaktadır.

Özellik

reader_writer_lock

srw Kilitle

Olmayan reentrant

Evet

Evet

Yazan (yükseltme desteği) okuyucuya yükseltebilirsiniz

Hayyr

Hayyr

Yazan Reader (sürüm düşürme desteği) indirgeyebilirsiniz

Hayyr

Hayyr

Tercih yazma kilidi

Evet

Hayyr

Yazarlar FIFO erişimi

Evet

Hayyr

srw kilitleri hakkında daha fazla bilgi için bkz: ince Okuyucu/Yazıcı (srw) kilit Platform SDK'ın.

Olay

Concurrency::event sınıfı, adsız bir Windows el ile sıfırlama olayı benzer.Ancak, bir event nesne davrandığını cooperatively, oysa Windows olay preemptively davranır.Windows olayları hakkında daha fazla bilgi için bkz: Olay nesneleri.

Örnek

Dd759350.collapse_all(tr-tr,VS.110).gifDescription

Arasındaki fark daha iyi anlamak için event sınıfı ve Windows olayları, aþaðýdaki örneði ele alalým.Bu örnek en fazla iki eşzamanlı görevler ve iki benzer işlevleri kullanan aramaları oluşturmak Zamanlayıcı etkinleştirir event sınıfı ve Windows el ile sıfırlama olayı.Her işlev, ilk paylaşılan bir olay haline erdiği bekleyin birkaç görev oluşturur.Her işlev, çalışan görevlerin ortaya çıkarır ve olay sinyal gönderir.Her işlev, sonra sinyal verilmiş olayı için bekler.

Dd759350.collapse_all(tr-tr,VS.110).gifKod

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

Dd759350.collapse_all(tr-tr,VS.110).gifComments

Bu örnek, aşağıdaki örnek çıktı üretir:

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.

Çünkü event sınıfı cooperatively davranır, sinyal verilmiş durumu girmek için bir olay beklediğinde Zamanlayıcı işleme başka bir içerik kaynakları yeniden tahsis edebilirsiniz.Bu nedenle, daha fazla iş kullanan sürüm tarafından gerçekleştirilir event sınıfı.Sonraki görev başlatılmadan önce Windows olayları kullanan sürüm sinyal verilmiş durumu bekleyen görev girmeniz gerekir.

Görevler hakkında daha fazla bilgi için bkz: Görev paralellik (eşzamanlılık çalışma zamanı).

Ayrıca bkz.

Başvuru

Kritik bölüm nesneleri

ince Okuyucu/Yazıcı (srw) kilitler

olay nesneleri

Kavramlar

Eşitleme veri yapıları