Porównywanie struktur danych synchronizacji z Windows API
W tym temacie porównuje zachowanie synchronizacji struktur danych, które są dostarczane przez program obsługi współbieżność z przedstawianymi przez interfejs API systemu Windows.
Wykonaj synchronizację struktur danych, które są dostarczane przez program obsługi współbieżność model wątka współpracy.W modelu wątkowości spółdzielni synchronizacji pierwotnych jawnie plon ich przetwarzania zasobów do innych wątków.To różni się od model wątka cenią sobie wcześniejsze, gdzie zasoby przetwarzania są przenoszone do innych wątków przez kontrolowanie harmonogramu lub system operacyjny.
critical_section
Concurrency::critical_section klasy podobny Windows CRITICAL_SECTION struktury, ponieważ może być stosowany tylko przez wątki jednego procesu.Aby uzyskać więcej informacji na temat sekcji krytycznych w interfejsie API systemu Windows, zobacz Obiekty krytyczne sekcji.
Klasa reader_writer_lock
Concurrency::reader_writer_lock klasy przypomina blokad slim czytnik (SRW) systemu Windows.W poniższej tabeli opisano podobieństw i różnic.
Funkcja |
reader_writer_lock |
Zablokuj SRW |
---|---|---|
Non użyty |
Tak |
Tak |
Można podwyższyć czytnika Writer (obsługuje uaktualnienia) |
Nie |
Nie |
Obniżenie poziomu pisarz dla czytnika (Obsługa starszą wersję) |
Nie |
Nie |
Blokada zapisu preferencji |
Tak |
Nie |
FIFO dostępu do modułów zapisujących |
Tak |
Nie |
Aby uzyskać więcej informacji na temat blokady SRW, zobacz blokad czytnik Slim (SRW) w zestawie SDK platformy.
zdarzenie
Concurrency::event klasy przypomina nienazwane, zdarzenie resetowania podręcznika systemu Windows.Jednakże event obiektu zachowuje się wspólnie, dlatego zdarzeń systemu Windows zachowuje się preemptively.Aby uzyskać więcej informacji dotyczących zdarzeń systemu Windows, zobacz Obiekty zdarzeń.
Przykład
Opis
Aby lepiej zrozumieć różnicę między event klasy i zdarzeń systemu Windows, należy wziąć pod uwagę w poniższym przykładzie.W tym przykładzie włącza harmonogram, aby utworzyć co najwyżej dwóch równoczesnych zadań, a następnie dwa podobne funkcje używające wywołania event klasy i zdarzenie resetowania obsługi systemu Windows.Każda funkcja najpierw tworzy kilka zadań, które czekać na udostępnionym zdarzenia stają się zasygnalizowane.Każda funkcja następnie plony uruchomionych zadań i następnie sygnały zdarzenie.Każda funkcja następnie oczekuje na zdarzenie sygnalizacji.
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();
}
Komentarze
Ten przykład generuje następujące przykładowe dane wyjściowe:
Ponieważ event klasy zachowuje się wspólnie, harmonogram można zmienić alokację zasobów przetwarzania do innego kontekstu, gdy zdarzenie oczekuje się wprowadzić stanie sygnalizacji.W związku z tym, więcej pracy jest realizowane przez wersję, która używa event klasy.W wersji, która używa zdarzeń systemu Windows każde zadanie oczekiwania należy wprowadzić stanie sygnalizacji przed rozpoczęciem następnego zadania.
Aby uzyskać więcej informacji o zadaniach, zobacz Równoległość zadania (współbieżność środowiska wykonawczego).