Rozważmy następującą aplikację: serwer wyszukiwania, który po uruchomieniu tworzy duży indeks stron internetowych oparty na danych odczytanych z dysku. Po zainicjalizowaniu indeksu w pamięci nie można modyfikować, a wiele wątków jest uruchamianych w celu obsługi zapytań użytkowników. Załóżmy, że serwer jest skompilowany do natywnego kodu i używa wątków systemu operacyjnego.Czy jest to możliwe do wdrożenia prymitywów współbieżności systemu Linux, które zapewniają lepszą izolację niż wątki, ale porównywalną wydajność?
Teraz model gwintowania nie zapewnia izolacji między wątkami. Wątek buggy lub dowolny kod niezwiązany z wątkiem może uszkodzić indeks lub uszkodzoną pamięć, która została przydzielona i logicznie należy do innego wątku. Takie problemy są trudne do wykrycia i debugowania.
Teoretycznie Linux pozwala wymusić lepszą izolację. Po zainicjowaniu indeksu pamięć, którą zajmuje, może być oznaczona jako tylko do odczytu. Wątki można zastąpić procesami, które współdzielą indeks (pamięć współdzieloną), ale inne niż te mają oddzielne stosy i nie mogą się wzajemnie uszkadzać. Nielegalne operacje są automatycznie wykrywane przez sprzęt i system operacyjny. Żadne muteksy ani inne operacje podstawowe synchronizacji nie są potrzebne. Wyścigi danych związane z pamięcią są całkowicie eliminowane.
Czy taki model jest możliwy do zastosowania w praktyce? Czy zdajesz sobie sprawę z jakiejkolwiek aplikacji z prawdziwego życia, która robi takie rzeczy? A może istnieją pewne podstawowe trudności, które sprawiają, że taki model jest niepraktyczny? Czy uważasz, że takie podejście wprowadziłoby obciążenie wydajnościowe w porównaniu z tradycyjnymi wątkami? Teoretycznie używana pamięć jest taka sama, ale czy istnieją problemy związane z implementacją, które spowalniałyby działanie?
Z pewnością istnieje aplikacja, która używa mmap do oznaczania różnych obszarów pamięci jako tylko do odczytu. Jednak zazwyczaj dzieje się tak ze względu na wydajność, a nie w celu ochrony przed błędnym kodem. – Gray
Chociaż z pewnością nie chcę rozpoczynać wojny religijnej, przejście na używanie języka (takiego jak Java), który obsługuje naprawdę niezmienne typy, rozwiązałoby wiele problemów z "błędnymi wątkami", które "psują pamięć". – Gray
Uszkodzenie pamięci w programach wielowątkowych występuje nie tylko wtedy, gdy wątek zapisuje się w losowej lokalizacji w pamięci (takie błędy są stosunkowo łatwe do uniknięcia i wykrywane), ale także wtedy, gdy wątek uzyskuje poprawne odniesienie do obiektu, który nie jest bezpieczny dla wątków i który jest używany przez jakiś inny wątek. Takie błędy są znacznie trudniejsze do uniknięcia i wykrycia i mogą wystąpić w dowolnym programie wielowątkowym, bez względu na język. –