Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De Gelijktijdigheidsruntime biedt verschillende gegevensstructuren waarmee u de toegang tot gedeelde gegevens vanuit meerdere threads kunt synchroniseren. Deze gegevensstructuren zijn handig wanneer u gegevens hebt gedeeld die u niet vaak wijzigt. Een synchronisatieobject, bijvoorbeeld een kritieke sectie, zorgt ervoor dat andere threads wachten totdat de gedeelde resource beschikbaar is. Als u een dergelijk object gebruikt om de toegang tot gegevens die vaak worden gebruikt, te synchroniseren, kunt u de schaalbaarheid in uw toepassing verliezen. De PPL (Parallel Patterns Library) biedt de gelijktijdigheid::combinatiebare klasse, waarmee u een resource kunt delen tussen verschillende threads of taken zonder synchronisatie. Zie combinable voor meer informatie over de klasse.
Afdelingen
In dit onderwerp worden de volgende asynchrone berichtbloktypen gedetailleerd beschreven:
kritieke sectie
De concurrentie::critical_section klasse vertegenwoordigt een coöperatief object voor wederzijdse uitsluiting dat andere taken voorrang geeft in plaats van ze te onderbreken. Kritieke secties zijn handig wanneer meerdere threads exclusieve lees- en schrijftoegang tot gedeelde gegevens vereisen.
De critical_section klasse is niet opnieuw binnenkomend. De concurrency::critical_section::lock-methode genereert een exceptie van het type concurrency::improper_lock als deze wordt aangeroepen door de thread die al eigenaar is van de vergrendeling.
Methoden en functies
In de volgende tabel ziet u de belangrijke methoden die door de critical_section klasse worden gedefinieerd.
| Methode | Beschrijving |
|---|---|
| slot | Hiermee wordt de kritieke sectie bemachtigd. De aanroepende context wordt geblokkeerd totdat de vergrendeling is verkregen. |
| try_lock | Probeert toegang tot de kritieke sectie te verkrijgen, maar blokkeert niet. |
| ontsluiten | Hiermee wordt de kritieke sectie vrijgegeven. |
[Boven]
lezer_schrijver_slot
De concurrency::reader_writer_lock class biedt thread-safe lees en schrijfbewerkingen voor gedeelde gegevens. Gebruik lezer/schrijververgrendelingen wanneer meerdere threads gelijktijdige leestoegang tot een gedeelde resource vereisen, maar zelden naar die gedeelde resource schrijven. Deze klasse biedt op elk gewenst moment slechts één thread schrijftoegang tot een object.
De reader_writer_lock klasse kan beter presteren dan de critical_section klasse omdat een critical_section object exclusieve toegang krijgt tot een gedeelde resource, waardoor gelijktijdige leestoegang wordt voorkomen.
Net als de critical_section klasse vertegenwoordigt de reader_writer_lock klasse een coöperatief object voor wederzijdse uitsluiting dat taken laat voorgaan in plaats van ze te verdringen.
Wanneer een thread die naar een gedeelde resource moet schrijven, een lezer/schrijververgrendeling verkrijgt, worden andere threads die ook toegang moeten hebben tot de resource geblokkeerd totdat de schrijver de vergrendeling vrijgeeft. De reader_writer_lock klasse is een voorbeeld van een schrijfvoorkeurvergrendeling , een vergrendeling die wachtschrijvers deblokkert voordat het wachtende lezers deblokkert.
Net als de critical_section klas is de reader_writer_lock klasse niet-reentrant. De gelijktijdigheid::reader_writer_lock::lock en gelijktijdigheid::reader_writer_lock::lock_read methoden genereren een uitzondering van het type improper_lock als ze worden aangeroepen door een thread die al eigenaar is van de vergrendeling.
Opmerking
Omdat de reader_writer_lock klasse niet herinvoerbaar is, kunt u geen alleen-lezenvergrendeling upgraden naar een lezer/schrijververgrendeling of een lezer/schrijververgrendeling downgraden naar een alleen-lezenvergrendeling. Het uitvoeren van een van deze bewerkingen produceert niet-opgegeven gedrag.
Methoden en functies
In de volgende tabel ziet u de belangrijke methoden die door de reader_writer_lock klasse worden gedefinieerd.
| Methode | Beschrijving |
|---|---|
| slot | Hiermee krijgt u lees-/schrijftoegang tot de vergrendeling. |
| try_lock | Probeert lees-/schrijftoegang tot de vergrendeling te verkrijgen, maar blokkeert niet. |
| lock_read | Hiermee krijgt u alleen-lezentoegang tot de vergrendeling. |
| try_lock_read | Probeert alleen-lezentoegang tot de vergrendeling te verkrijgen, maar wordt niet geblokkeerd. |
| ontsluiten | Laat de vergrendeling los. |
[Boven]
scoped_lock en scoped_lock_read
De critical_section en reader_writer_lock klassen bieden geneste helperklassen waarmee u eenvoudiger kunt werken met wederzijdse uitsluitingsobjecten. Deze helperklassen worden scoped-vergrendelingen genoemd.
De critical_section klasse bevat de concurrency::critical_section::scoped_lock klasse. De constructor krijgt toegang tot het opgegeven critical_section object; destructor geeft toegang tot dat object vrij. De reader_writer_lock-klasse bevat de concurrency::reader_writer_lock::scoped_lock-klasse, die lijkt op critical_section::scoped_lock, behalve dat het schrijftoegang tot het opgegeven reader_writer_lock-object beheert. De reader_writer_lock klasse bevat de klasse concurrency::reader_writer_lock::scoped_lock_read. Deze klasse beheert leestoegang tot het opgegeven reader_writer_lock object.
Scoped-vergrendelingen bieden verschillende voordelen wanneer u handmatig met critical_section en reader_writer_lock objecten werkt. Doorgaans wijst u een bereikvergrendeling toe aan de stack. Een scoped lock geeft automatisch de toegang tot zijn wederzijdse uitsluitingsobject vrij wanneer het wordt vernietigd; daarom ontgrendelt u het onderliggende object niet handmatig. Dit is handig wanneer een functie meerdere return instructies bevat. Met bereikvergrendelingen kunt u ook uitzonderingsveilige code schrijven. Wanneer een throw instructie ervoor zorgt dat de stack wordt afgewikkeld, wordt de destructor van een actieve scope-vergrendeling aangeroepen en wordt het wederzijdse uitsluitingsobject daarom altijd correct vrijgegeven.
Opmerking
Wanneer u de critical_section::scoped_lock, reader_writer_lock::scoped_locken reader_writer_lock::scoped_lock_read klassen gebruikt, moet u de toegang tot het onderliggende object voor wederzijdse uitsluiting niet handmatig vrijgeven. Hierdoor kan de runtime een ongeldige status hebben.
gebeurtenis
De gelijktijdigheid::gebeurtenisklasse vertegenwoordigt een synchronisatieobject waarvan de status kan worden gesignaleerd of niet-gesignaleerd. In tegenstelling tot synchronisatieobjecten, zoals kritieke secties, waarvan het doel is om de toegang tot gedeelde gegevens te beveiligen, synchroniseren gebeurtenissen de uitvoeringsstroom.
De event klasse is handig wanneer de ene taak werk voor een andere taak heeft voltooid. Een taak kan bijvoorbeeld een andere taak aangeven dat deze gegevens heeft gelezen uit een netwerkverbinding of uit een bestand.
Methoden en functies
In de volgende tabel ziet u een aantal van de belangrijke methoden die door de event klasse worden gedefinieerd.
| Methode | Beschrijving |
|---|---|
| wachten | Wacht totdat de gebeurtenis wordt gesignaleerd. |
| instellen | Hiermee stelt u de gebeurtenis in op de gesignaleerde status. |
| opnieuw instellen | Hiermee stelt u de gebeurtenis in op de niet-gesignaleerde status. |
| wacht_op_meerdere | Wacht tot er meerdere gebeurtenissen worden gesignaleerd. |
Voorbeeld
Zie event voor een voorbeeld dat laat zien hoe u de klasse gebruikt.
[Boven]
Gerelateerde Secties
Synchronisatiegegevensstructuren vergelijken met de Windows-API
Vergelijkt het gedrag van de synchronisatiegegevensstructuren met die van de Windows-API.
Gelijktijdigheidsruntime
Beschrijft de Gelijktijdigheidsruntime, die parallelle programmering vereenvoudigt en koppelingen naar verwante onderwerpen bevat.