Wyobraź sobie, że piszesz aplikację bankową, a Twój wniosek zawierał prośbę o wycofanie dziesięciu funtów (tak, jestem Anglikiem;)) z konta. Musisz więc odczytać saldo rachunku bieżącego w zmiennej lokalnej, odjąć wypłatę, a następnie zapisać saldo z powrotem w pamięci.
Co jednak, jeśli pojawi się inna, równoległa prośba między odczytaniem wartości a jej zapisaniem? Istnieje możliwość, że wynik tego żądania zostanie całkowicie nadpisany przez pierwszy, a saldo konta będzie nieprawidłowe.
Testowanie i ustawianie pomaga nam rozwiązać ten problem, sprawdzając, czy wartość, jaką nadpisuje, jest taka, jaka powinna być. W takim przypadku możesz sprawdzić, czy saldo było oryginalną wartością, którą przeczytałeś. Ponieważ jest atomowy, jest nie przerywać, więc nikt nie może wyciągnąć dywanu spod siebie między czytaniem a pisaniem.
Innym sposobem rozwiązania tego samego problemu jest wyjęcie zamka w miejscu w pamięci. Niestety, zamki są niezwykle trudne do uzyskania, trudne do zrozumienia, mają problemy z skalowalnością i źle się zachowują w obliczu awarii, więc nie są idealnym (ale zdecydowanie praktycznym) rozwiązaniem. Metody testowania i ustawiania stanowią podstawę niektórych Software Transactional Memories, które optymistycznie pozwalają na jednoczesną realizację każdej transakcji, kosztem wycofania wszystkich z powrotem w przypadku konfliktu.
+1 Pomagałeś mi rozwiązać problem, nad którym pracowałem. –
@ jason-cohen: To w rzeczywistości opis [Porównaj i zamień] (https://en.wikipedia.org/wiki/Compare-and-swap). Testowanie i ustawianie zwykle obejmuje tylko wartości 0 i 1. Część ** set ** odnosi się do ustawienia wartości w określonej lokalizacji pamięci na 1. Zwraca poprzednią wartość, 1 lub 0, i robi to wszystko. w pojedynczej operacji atomowej. –
@GregSlepak jest poprawny, to jest compare_and_swap. test_and_set() pobiera wskaźnik boolowski do celu, ustawia go na TRUE i zwraca oryginalną wartość wskaźnika. Jeśli zwracana wartość test_and_set (& lock) (tj. Oryginalna wartość & lock) jest prawdziwa, to wpisujemy sekcję krytyczną. – mateor