Interlocked zmienny dostęp
Aplikacje muszą synchronizować dostęp do zmiennych współużytkowanych przez wiele wątków. Aplikacje muszą również zapewnić, że operacje na tych zmiennych są wykonywane niepodziealnie (wykonywane w całości lub w ogóle).
Proste operacje odczytu i zapisu do odpowiednio wyrównanych zmiennych 32-bitowych to operacje niepodzielne. Innymi słowy, nie zostanie zaktualizowana tylko jedna część zmiennej; wszystkie bity są aktualizowane w sposób niepodzielne. Nie ma jednak gwarancji, że dostęp zostanie zsynchronizowany. Jeśli dwa wątki odczytują i zapisują z tej samej zmiennej, nie można określić, czy jeden wątek wykona operację odczytu, zanim druga wykona operację zapisu.
Proste operacje odczytu i zapisu do poprawnie wyrównanych zmiennych 64-bitowych są niepodzielne w 64-bitowym systemie Windows. Odczyty i zapisy do 64-bitowych wartości nie mają gwarancji, że nie będą niepodzielne w 32-bitowym systemie Windows. Operacje odczytu i zapisu w zmiennych innych rozmiarów nie są gwarantowane jako niepodzielne na żadnej platformie.
Interlocked API (Międzylokowany interfejs API)
Funkcje połączone zapewniają prosty mechanizm synchronizowania dostępu do zmiennej, która jest współużytkowana przez wiele wątków. Wykonują również operacje na zmiennych w sposób niepodzielne. Wątki różnych procesów mogą używać tych funkcji, jeśli zmienna jest w pamięci udostępnionej.
Funkcje InterlockedIncrement i InterlockedDecrement łączą kroki związane z zwiększaniem lub dekrementowaniem zmiennej w operację niepodzieną. Ta funkcja jest przydatna w wielozadaniowym systemie operacyjnym, w którym system może przerwać wykonywanie jednego wątku, aby udzielić fragmentu czasu procesora innemu wątkowi. Bez takiej synchronizacji dwa wątki mogą odczytywać tę samą wartość, zwiększać ją o 1 i przechowywać nową wartość dla całkowitego wzrostu 1 zamiast 2. Połączone funkcje dostępu do zmiennych chronią przed tego rodzaju błędami.
Funkcje InterlockedExchange i InterlockedExchangePointer niepodziecznie wymieniają wartości określonych zmiennych. Funkcja InterlockedExchangeAdd łączy dwie operacje: dodanie dwóch zmiennych i zapisanie wyniku w jednej ze zmiennych.
InterlockedCompareExchange, InterlockedCompare64Exchange128i InterlockedCompareExchangePointer funkcje łączą dwie operacje: porównywanie dwóch wartości i przechowywanie trzeciej wartości w jednej ze zmiennych na podstawie wyniku porównania.
InterlockedAnd, InterlockedOri InterlockedXor funkcje niepodzieal wykonują operacje AND, OR i XOR, odpowiednio.
Istnieją funkcje, które zostały specjalnie zaprojektowane do wykonywania międzylokowanego dostępu zmiennej na 64-bitowych wartościach pamięci i adresach, i są zoptymalizowane pod kątem użycia w 64-bitowym systemie Windows. Każda z tych funkcji zawiera wartość "64" w nazwie; na przykład InterlockedDecrement64 i InterlockedCompareExchangeAcquire64.
Większość połączonych funkcji zapewnia pełne bariery pamięci na wszystkich platformach Windows. Istnieją również funkcje, które łączą podstawowe operacje dostępu zmiennej ze zmienną wzajemnie zablokowaną przy użyciu semantyki sekmantyki pozyskiwania i wydawania pamięci obsługiwanej przez niektóre procesory. Każda z tych funkcji zawiera słowo "Acquire" lub "Release" w nazwach; na przykład InterlockedDecrementAcquire i InterlockedDecrementRelease. Uzyskiwanie semantyki pamięci określa, że operacja pamięci wykonywana przez bieżący wątek będzie widoczna przed podjęciem próby wykonania innych operacji pamięci. Semantyka pamięci wydania określa, że operacja pamięci wykonywana przez bieżący wątek będzie widoczna po zakończeniu wszystkich innych operacji pamięci. Te semantyka umożliwia wymuszenie wykonywania operacji pamięci w określonej kolejności. Użyj semantyki uzyskiwania podczas wprowadzania chronionego regionu i semantyki wydania podczas opuszczania.
Tematy pokrewne
-
problemy z synchronizacją i wieloma procesorami