Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Concurrency Runtime innehåller flera datastrukturer som gör att du kan synkronisera åtkomst till delade data från flera trådar. Dessa datastrukturer är användbara när du har delat data som du ändrar sällan. Ett synkroniseringsobjekt, till exempel ett kritiskt avsnitt, gör att andra trådar väntar tills den delade resursen är tillgänglig. Om du använder ett sådant objekt för att synkronisera åtkomst till data som används ofta kan du därför förlora skalbarheten i ditt program.
PPL (Parallel Patterns Library) tillhandahåller klassen concurrency::combinable, som gör att du kan dela en resurs mellan flera trådar eller aktiviteter utan att behöva synkroniseras. Mer information om klassen finns i combinableParallella containrar och objekt.
Sektioner
I det här avsnittet beskrivs följande asynkrona typer av meddelandeblock i detalj:
kritisk sektion
Klassen concurrency::critical_section representerar ett kooperativt ömsesidigt exkluderingsobjekt som låter andra uppgifter fortsätta i stället för att avbryta dem. Viktiga avsnitt är användbara när flera trådar kräver exklusiv läs- och skrivåtkomst till delade data.
Klassen critical_section är icke-reentrant. Metoden concurrency::critical_section::lock genererar ett undantag av typen concurrency::improper_lock om den anropas av tråden som redan äger låset.
Metoder och funktioner
I följande tabell visas de viktiga metoder som definieras av critical_section klassen.
| Metod | Beskrivning |
|---|---|
| lås | Tar kontroll över den kritiska sektionen. Samtalskontexten blockeras tills låset hämtas. |
| try_lock | Försöker hämta det kritiska avsnittet, men blockerar inte. |
| låsa upp | Släpper det kritiska avsnittet. |
[Topp]
läsare-skrivarlås
Klassen concurrency::reader_writer_lock tillhandahåller trådsäkra läs-/skrivåtgärder för delade data. Använd läs-/skrivlås när flera trådar kräver samtidig läsåtkomst till en delad resurs men sällan skriver till den delade resursen. Den här klassen ger bara en trådskrivningsåtkomst till ett objekt när som helst.
Klassen reader_writer_lock kan prestera bättre än critical_section klassen eftersom ett critical_section objekt får exklusiv åtkomst till en delad resurs, vilket förhindrar samtidig läsåtkomst.
Precis som critical_section-klassen representerar reader_writer_lock-klassen ett samarbetsobjekt för ömsesidig uteslutning som ger plats åt andra uppgifter i stället för att preemptera dem.
När en tråd som måste skriva till en delad resurs hämtar ett läsar-/skrivlås blockeras andra trådar som också måste komma åt resursen tills skrivaren släpper låset. Klassen reader_writer_lock är ett exempel på ett skrivinställningslås , vilket är ett lås som avblockera väntande författare innan det avblockeras väntande läsare.
Liksom klassen critical_section är klassen reader_writer_lock icke-reentrant.
concurrency::reader_writer_lock::lås och concurrency::reader_writer_lock::lock_read metoderna utlöser ett undantag av typen improper_lock om de anropas av en tråd som redan äger låset.
Anmärkning
reader_writer_lock Eftersom klassen inte är reentrant kan du inte uppgradera ett endast läsbart lås till ett läs-/skrivlås eller nedgradera ett läs-/skrivlås till ett endast läsbart lås. Om du utför någon av dessa åtgärder skapas ett ospecificerat beteende.
Metoder och funktioner
I följande tabell visas de viktiga metoder som definieras av reader_writer_lock klassen.
| Metod | Beskrivning |
|---|---|
| lås | Hämtar läs-/skrivåtkomst till låset. |
| try_lock | Försöker hämta läs-/skrivåtkomst till låset, men blockerar inte. |
| lock_read | Hämtar endast läsbar åtkomst till låset. |
| try_lock_read | Försöker hämta skrivskyddad åtkomst till låset, men blockerar inte. |
| låsa upp | Frigör låset. |
[Topp]
scoped_lock och scoped_lock_read
Klasserna critical_section och reader_writer_lock tillhandahåller kapslade hjälpklasser som förenklar hur du arbetar med objekt för ömsesidig uteslutning. Dessa hjälpklasser kallas avgränsade lås.
Klassen critical_section innehåller klassen som heter concurrency::critical_section::scoped_lock. Konstruktorn hämtar åtkomst till det angivna critical_section-objektet; destruktor släpper åtkomst till det objektet. Klassen reader_writer_lock innehåller klassen concurrency::reader_writer_lock::scoped_lock , som liknar critical_section::scoped_lock, förutom att den hanterar skrivåtkomst till det angivna reader_writer_lock objektet. Klassen reader_writer_lock innehåller även samtidighet::reader_writer_lock::scoped_lock_read klass. Den här klassen hanterar läsåtkomst till det angivna reader_writer_lock objektet.
Begränsade lås ger flera fördelar när du arbetar med critical_section och reader_writer_lock objekt manuellt. Vanligtvis allokerar du ett begränsat lås på stacken. Ett begränsat lås frigör automatiskt åtkomst till dess objekt för ömsesidig uteslutning när det förstörs. Därför låser du inte upp det underliggande objektet manuellt. Detta är användbart när en funktion innehåller flera return instruktioner. Begränsade lås kan också hjälpa dig att skriva undantagssäker kod. När en throw -instruktion får stacken att varva ned anropas destruktor för alla aktiva lås med omfång, och därför frigörs alltid objektet för ömsesidig uteslutning korrekt.
Anmärkning
När du använder klasserna critical_section::scoped_lock, reader_writer_lock::scoped_lockoch reader_writer_lock::scoped_lock_read frigör du inte åtkomst manuellt till det underliggande objektet för ömsesidig uteslutning. Detta kan försätta körningstiden i ett ogiltigt tillstånd.
händelse
Concurrency::event-klassen representerar ett synkroniseringsobjekt vars tillstånd kan signaleras eller inte signaleras. Till skillnad från synkroniseringsobjekt, till exempel kritiska avsnitt, vars syfte är att skydda åtkomsten till delade data, synkroniserar händelser körningsflödet.
Klassen event är användbar när en uppgift har slutfört arbetet för en annan aktivitet. En aktivitet kan till exempel signalera en annan aktivitet att den har läst data från en nätverksanslutning eller från en fil.
Metoder och funktioner
Följande tabell visar flera av de viktiga metoder som definieras av event klassen.
| Metod | Beskrivning |
|---|---|
| Vänta | Väntar på att händelsen ska signaleras. |
| ställ in | Ställer in händelsen till det signalerade tillståndet. |
| återställa | Sätter händelsen till det icke-signalerade tillståndet. |
| vänta_på_flera | Väntar på att flera händelser ska signaleras. |
Exempel
Ett exempel som visar hur du event använder klassen finns i Jämföra synkroniseringsdatastrukturer med Windows-API:et.
[Topp]
Relaterade avsnitt
Jämföra synkroniseringsdatastrukturer med Windows-API:et
Jämför beteendet för synkroniseringsdatastrukturerna med de som tillhandahålls av Windows-API:et.
Samtidighetskörning
Beskriver Concurrency Runtime, som förenklar parallell programmering och innehåller länkar till relaterade ämnen.