Delen via


Toegang tot variabele tussen vergrendelingen

Toepassingen moeten de toegang synchroniseren tot variabelen die worden gedeeld door meerdere threads. Toepassingen moeten er ook voor zorgen dat bewerkingen op deze variabelen atomisch worden uitgevoerd (in hun geheel of helemaal niet.)

Eenvoudige lees- en schrijfbewerkingen naar correct uitgelijnde 32-bits variabelen zijn atomische bewerkingen. Met andere woorden, u eindigt niet met slechts één deel van de variabele bijgewerkt; alle bits worden op atomische wijze bijgewerkt. Toegang wordt echter niet gegarandeerd gesynchroniseerd. Als twee threads lezen en schrijven vanuit dezelfde variabele, kunt u niet bepalen of de ene thread de leesbewerking uitvoert voordat de andere de schrijfbewerking uitvoert.

Eenvoudige lees- en schrijfbewerkingen naar correct uitgelijnde 64-bits variabelen zijn atomisch in 64-bits Windows. Lees- en schrijfbewerkingen naar 64-bits waarden zijn niet gegarandeerd atomisch in 32-bits Windows. Lees- en schrijfbewerkingen naar variabelen van andere grootten zijn niet gegarandeerd atomisch op elk platform.

De ingesloten API

De vergrendelde functies bieden een eenvoudig mechanisme voor het synchroniseren van de toegang tot een variabele die wordt gedeeld door meerdere threads. Ze voeren ook bewerkingen uit op variabelen op een atomische manier. De threads van verschillende processen kunnen deze functies gebruiken als de variabele zich in het gedeelde geheugen bevindt.

De functies InterlockedIncrement en InterlockedDecrement combineren de stappen voor het verhogen of verlagen van een variabele in een atomische bewerking. Deze functie is handig in een multitasking-besturingssysteem, waarin het systeem de uitvoering van een thread kan onderbreken om een segment processortijd aan een andere thread te verlenen. Zonder dergelijke synchronisatie kunnen twee threads dezelfde waarde lezen, deze met 1 verhogen en de nieuwe waarde opslaan voor een totale toename van 1 in plaats van 2. De functies voor vergrendelde variabelentoegang beschermen tegen dit soort fouten.

De InterlockedExchange- en interlockedExchangePointer-functies de waarden van de opgegeven variabelen atomisch uitwisselen. De functie InterlockedExchangeAdd combineert twee bewerkingen: twee variabelen samenvoegen en het resultaat opslaan in een van de variabelen.

De InterlockedCompareExchange, InterlockedCompare64Exchange128en InterlockedCompareExchangePointer functies combineren twee bewerkingen: twee waarden vergelijken en een derde waarde opslaan in een van de variabelen, op basis van het resultaat van de vergelijking.

De InterlockedAnd, InterlockedOren InterlockedXor functies atomisch uitvoeren EN, OF en XOR-bewerkingen.

Er zijn functies die speciaal zijn ontworpen voor het uitvoeren van interoperabiliteitsvariabeletoegang op 64-bits geheugenwaarden en -adressen en die zijn geoptimaliseerd voor gebruik op 64-bits Windows. Elk van deze functies bevat '64' in de naam; bijvoorbeeld InterlockedDecrement64 en InterlockedCompareExchangeAcquire64.

De meeste onderling vergrendelde functies bieden volledige geheugenbarrières op alle Windows-platforms. Er zijn ook functies die de basisbewerkingen voor toegang tot variabelen combineren met de semantiek voor het verkrijgen en vrijgeven van geheugen die door bepaalde processors worden ondersteund. Elk van deze functies bevat het woord "Acquire" of "Release" in hun namen; bijvoorbeeld InterlockedDecrementAcquire en InterlockedDecrementRelease. Verwerf geheugensemantiek die aangeeft dat de geheugenbewerking die door de huidige thread wordt uitgevoerd, zichtbaar is voordat andere geheugenbewerkingen worden uitgevoerd. Semantiek voor geheugen vrijgeven geeft aan dat de geheugenbewerking die door de huidige thread wordt uitgevoerd, zichtbaar is nadat alle andere geheugenbewerkingen zijn voltooid. Met deze semantiek kunt u afdwingen dat geheugenbewerkingen in een specifieke volgorde worden uitgevoerd. Gebruik semantiek verkrijgen bij het invoeren van een beveiligde regio en semantiek vrijgeven wanneer u deze verlaat.

Compiler-intrinsieke

synchronisatie- en multiprocessorproblemen