Reading Bartosz Milewski fantastycznie blog post na STM, byłem podekscytowany, aby przeczytać, co następuje:Czy protokół STM zapewnia precyzyjne blokowanie istniejących struktur danych?
jednak brać pod uwagę ważny fakt: STM jest bardzo drobnoziarnista. W przypadku instancji podczas wstawiania elementu do drzewa transakcja STM blokuje tylko te węzły, które faktycznie modyfikujesz. STM z łatwością pokona rozwiązanie wykorzystujące jedną globalną blokadę na całe drzewo .
Jednak, jak rozumiem, zachowanie to nie jest automatyczne, prawda? Jeśli używam numeru TVar (Map k a)
, czy nie działa on jako pojedynczy globalny zamek na całej mapie? Aby uzyskać korzyści z tego drobiazgowego zachowania, ja (lub ktoś) musiałbym wdrożyć wymianę mapy (na przykład TMap
), która zawiera wewnętrznie, TVars
, prawda?
To może wydawać się oczywistym pytaniem, ale czytając o implementacji STM byłem zdezorientowany między odczytami TVar
s a odczytami lokalizacji pamięci. Chcę tylko upewnić się, że mam to dobrze!
Bartosz idzie dalej do powiedzenia:
Per-węzła zamek Instrukcja jest trudne do wdrożenia poprawnie, ponieważ na ryzyko zakleszczenia.
Różnica z STM, jak zrozumieć, że podczas gdy realizacja STM w efekcie wykorzystuje blokuje drogę ręcznie zablokowana rozwiązanie może rzeczywista ACQuiry i zwolnienie blokad jest obsługiwany przez program, a nie programista - poprawny?
To zależy od implementacji, ale istnieje wiele sposobów na zaimplementowanie STM (na przykład porównanie atomów i wymiana). Jeśli chodzi o twoje pierwsze pytanie, tak, potrzebujesz map 'TVar's, a nie' TVar (Map k v) '. –
@ ThomasM.DuBuisson dzięki za to. Czy masz na myśli, że mogę rzeczywiście mieć szczegółową "Mapę", czy też musiałbym całkowicie ponownie zaimplementować 'Mapę' do wewnętrznego używania' TVar'? –
Ponadto, właśnie dowiedziałem się, że "acquiry" jest w rzeczywistości słowem. Szczęśliwy traf. –