Sdílet prostřednictvím


Přístup k vzájemně uzamčeným proměnným

Aplikace musí synchronizovat přístup k proměnným sdíleným více vlákny. Aplikace také musí zajistit, aby se operace s těmito proměnnými prováděly atomicky (provádějí se v plném rozsahu nebo vůbec.)

Jednoduché čtení a zápisy do správně zarovnaných 32bitových proměnných jsou atomické operace. Jinými slovy, nebudete mít pouze jednu část proměnné aktualizovanou; všechny bity se aktualizují atomickým způsobem. Není však zaručeno, že se bude synchronizovat přístup. Pokud dvě vlákna čtou a zapisují ze stejné proměnné, nemůžete určit, jestli jedno vlákno provede operaci čtení předtím, než druhý provede operaci zápisu.

Jednoduché čtení a zápisy do správně zarovnaných 64bitových proměnných jsou atomické v 64bitovém systému Windows. Čtení a zápisy na 64bitové hodnoty nejsou zaručeny atomické v 32bitovém systému Windows. Čtení a zápisy do proměnných jiných velikostí není zaručeno atomické na žádné platformě.

The Interlocked API

Vzájemně zablokované funkce poskytují jednoduchý mechanismus pro synchronizaci přístupu k proměnné, která je sdílena více vlákny. Provádějí také operace s proměnnými atomickým způsobem. Vlákna různých procesů mohou tyto funkce použít, pokud je proměnná ve sdílené paměti.

Funkce InterlockedIncrement a InterlockedDecrement kombinují kroky spojené s přírůstkem nebo dekrementací proměnné do atomické operace. Tato funkce je užitečná v operačním systému multitaskingu, ve kterém může systém přerušit provádění jednoho vlákna a udělit řez času procesoru jinému vláknu. Bez takové synchronizace by dvě vlákna mohla číst stejnou hodnotu, zvýšit ji o 1 a uložit novou hodnotu pro celkové zvýšení o 1 místo 2. Vzájemně zablokované funkce pro přístup k proměnným chrání před tímto typem chyby.

InterlockedExchange a InterlockedExchangePointer funkce atomicky vyměňují hodnoty zadaných proměnných. Funkce InterlockedExchangeAdd kombinuje dvě operace: sečtením dvou proměnných a uložením výsledku do jedné z proměnných.

InterlockedCompareExchange, InterlockedCompare64Exchange128a InterlockedCompareExchangePointer kombinují dvě operace: porovnávání dvou hodnot a uložení třetí hodnoty v jedné z proměnných na základě výsledku porovnání.

InterlockedAnd, InterlockedOr a InterlockedXor funkce atomicky provádět operace AND, OR a XOR.

Existují funkce, které jsou speciálně navržené tak, aby prováděly vzájemně uzamčený přístup k proměnným s 64bitovými hodnotami a adresami paměti a jsou optimalizované pro použití v 64bitovém systému Windows. Každá z těchto funkcí obsahuje v názvu "64"; Například InterlockedDecrement64 a InterlockedCompareExchangeAcquire64.

Většina vzájemně propojených funkcí poskytuje úplné paměťové bariéry na všech platformách Windows. K dispozici jsou také funkce, které kombinují základní operace přístupu k vzájemně zablokovaným proměnným s sémantika řazení paměti získání a uvolnění paměti podporovaná určitými procesory. Každá z těchto funkcí obsahuje ve svých názvech slovo "Získat" nebo "Release"; Například InterlockedDecrementAcquire a InterlockedDecrementRelease. Získání sémantiky paměti určuje, že operace paměti prováděná aktuálním vláknem bude viditelná před pokusem o další operace paměti. Sémantika paměti vydané verze určuje, že operace paměti prováděná aktuálním vláknem bude viditelná po dokončení všech ostatních operací paměti. Tato sémantika umožňuje vynutit provádění operací paměti v určitém pořadí. Při zadávání chráněné oblasti a sémantiky uvolnění při opuštění této oblasti použijte sémantiku získání.

vnitřní funkce kompilátoru

Problémy se synchronizací a multiprocesorem