Według blogu GoJak bezpieczne są mapy Golang dla współbieżnych operacji odczytu/zapisu?
Mapy nie są bezpieczne dla jednoczesnego stosowania: to nie jest zdefiniowane, co się dzieje, kiedy czytać i pisać do nich jednocześnie. Jeśli chcesz odczytywać i zapisywać na mapie od równoczesnego wykonywania goroutines, dostęp musi być mediowany przez jakiś mechanizm synchronizacji. (źródło: https://blog.golang.org/go-maps-in-action)
Czy ktoś może to wyjaśnić? Równoczesne operacje odczytu wydają się dopuszczalne w obrębie procedur, ale współbieżne operacje odczytu/zapisu mogą generować warunki wyścigu, jeśli ktoś próbuje odczytać i zapisać do tego samego klucza.
Czy to ostatnie ryzyko może zostać w niektórych przypadkach ograniczone? Na przykład:
- Funkcja A generuje k i ustawia m [k] = 0. Jest to jedyny czas, jaki A pisze, aby zmapować m. k wiadomo, że nie jest w m.
- A przechodzi do funkcji B działa jednocześnie
- A następnie odczytuje m [k]. Jeśli m [k] == 0, czeka, kontynuując tylko wtedy, gdy m [k]! = 0
- B szuka k na mapie. Jeśli ją znajdzie, B ustawia m [k] na pewną dodatnią liczbę całkowitą. Jeśli nie, czeka, aż k jest wm.
To nie jest kod (oczywiście), ale myślę, że pokazuje kontury przypadku, w którym nawet jeśli A i B będą próbowali uzyskać dostęp do m, nie będzie warunku wyścigu, lub jeśli jest on wygrany ma znaczenie z powodu dodatkowych ograniczeń.
Potrzebujemy odtwarzalnego przykładu: [Jak utworzyć przykład minimalny, pełny i sprawdzalny.] (Http://stackoverflow.com/help/mcve) – peterSO
Uruchom swój kod za pomocą detektora wyścigów. – JimB
Nie bezpieczne. Przejdź 1.6 [dodano wykrywanie przypadków jednoczesnego niewłaściwego wykorzystania map] z najlepszym wysiłkiem (https://golang.org/doc/go1.6#runtime). Środowisko wykonawcze powoduje awarię programu po wykryciu niewłaściwego użycia. –