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
Description
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.
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();
}
Comments
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
ince Okuyucu/Yazıcı (srw) kilitler