Megosztás a következőn keresztül:


Összekapcsolt változóhozzáférés

Az alkalmazásoknak szinkronizálnia kell a több szál által megosztott változókhoz való hozzáférést. Az alkalmazásoknak azt is biztosítaniuk kell, hogy az ezeken a változókon végzett műveletek atomi módon történjenek (teljes egészükben vagy egyáltalán nem.)

A 32 bites változókhoz igazított egyszerű olvasások és írások atomi műveletek. Más szóval a változónak nem csak egy része lesz frissítve; minden bit atomi módon frissül. A hozzáférés azonban nem garantáltan szinkronizálódik. Ha két szál ugyanabból a változóból olvas és ír, nem állapítható meg, hogy az egyik szál végrehajtja-e az olvasási műveletet, mielőtt a másik végrehajtja az írási műveletet.

A 64 bites változókhoz igazított egyszerű olvasások és írások atomiak a 64 bites Windowson. A 64 bites értékekre való olvasás és írás nem garantáltan atomi a 32 bites Windowson. Az olvasások és írások más méretű változókra nem garantáltan atomiak egyetlen platformon sem.

Az összekapcsolt API

Az összekapcsolt függvények egyszerű mechanizmust biztosítanak egy több szál által megosztott változóhoz való hozzáférés szinkronizálásához. Emellett atomi módon hajtanak végre műveleteket a változókon. A különböző folyamatok szálai akkor használhatják ezeket a függvényeket, ha a változó megosztott memóriában van.

Az InterlockedIncrement és InterlockedDecrement függvények egyesítik a változók atomi műveletté való növelésének vagy dekrementálásának lépéseit. Ez a funkció egy többfeladatos operációs rendszerben hasznos, amelyben a rendszer megszakíthatja az egyik szál végrehajtását, hogy processzoridőt adjon egy másik szálnak. Ilyen szinkronizálás nélkül két szál is beolvassa ugyanazt az értéket, 1-gyel növeli azt, és az új értéket 2 helyett 1-es teljes növekedésre tárolja. Az összekapcsolt változóelérési függvények védelmet nyújtanak az ilyen típusú hibák ellen.

Az InterlockedExchange és InterlockedExchangePointer függvények atomilag kicserélik a megadott változók értékeit. Az InterlockedExchangeAdd függvény két műveletet egyesít: két változó összeadását és az eredmény tárolását az egyik változóban.

Az InterlockedCompareExchange, InterlockedCompare64Exchange128és InterlockedCompareExchangePointer függvények két műveletet kombinálnak: két érték összehasonlítását és egy harmadik érték tárolását az egyik változóban az összehasonlítás eredménye alapján.

Az InterlockedAnd, InterlockedOrés InterlockedXor függvények atomilag végrehajtják az AND, OR és XOR műveleteket.

Léteznek olyan függvények, amelyek kifejezetten a 64 bites memóriaértékeken és -címeken való összekapcsolt változóhozzáféréshez lettek kialakítva, és 64 bites Windows rendszeren való használatra vannak optimalizálva. Ezen függvények mindegyike a "64"-et tartalmazza a névben; például InterlockedDecrement64 és InterlockedCompareExchangeAcquire64.

A legtöbb összekapcsolt függvény teljes memóriakorlátot biztosít minden Windows-platformon. Vannak olyan függvények is, amelyek kombinálják az alapszintű, összekapcsolt változóelérési műveleteket az egyes processzorok által támogatott beolvasási és kiadási memóriarendezési szemantikával. Ezek a függvények a nevükben a "Beszerzés" vagy a "Release" szót tartalmazzák; például InterlockedDecrementAcquire és InterlockedDecrementRelease. A memória szemantikájának beszerzése azt határozza meg, hogy az aktuális szál által végrehajtott memóriaművelet látható legyen, mielőtt bármilyen más memóriaműveletet megkísérlenének. A memóriaszemantika felszabadítása azt határozza meg, hogy az aktuális szál által végrehajtott memóriaművelet látható legyen az összes többi memóriaművelet befejezése után. Ezek a szemantikák lehetővé teszik a memóriaműveletek meghatározott sorrendben történő végrehajtását. Használjon beolvasási szemantikát védett régióba való belépéskor, és kilépéskor engedje el a szemantikát.

Fordító belső

szinkronizálási és többprocesszoros problémák