Udostępniony zasób ==Spór
Zapis do normalnego pliku z definicji jest operacją serializowaną. Nie zyskujesz wydajności, próbując zapisywać do niej z wielu wątków, we/wy jest skończonym zasobem o rzędach wielkości mniejszej przepustowości niż nawet najwolniejszy lub najbardziej przeciążony procesor.
Jednoczesny dostęp do współdzielonego zasobu może być skomplikowany (i powolny)
Jeśli masz wiele wątków, które wykonują kosztowne obliczenia, to masz opcje, jeśli używasz wielu wątków, ponieważ myślisz, że coś przyspieszysz, po prostu zrobisz coś przeciwnego. Rywalizacja o I/O zawsze spowalnia dostęp do zasobu, nigdy go nie przyspiesza ze względu na oczekiwanie na blokadę i inne obciążenie.
Musisz mieć sekcję krytyczną, która jest chroniona i pozwala tylko na jednego autora na raz. Po prostu wyszukaj kod źródłowy dowolnego programu zapisującego logowanie, który obsługuje współbieżność, a zobaczysz, że jest tylko jeden wątek, który zapisuje do pliku.
Jeśli Twoja aplikacja to przede wszystkim:
-
Powiązanie z procesorem: Możesz użyć jakiegoś mechanizmu blokującego/konstrukcji danych, aby pozwolić tylko jednemu z wielu wątków zapisywać do pliku na raz, co będzie bezużyteczne z punktu widzenia współbieżności jako rozwiązanie naiwne; Jeśli te wątki są powiązane z procesorem i mają niewielką liczbę operacji we/wy, może to zadziałać.
-
Powiązanie we/wy: Jest to najczęstszy przypadek, musisz użyć systemu przekazywania komunikatów z jakąś kolejką i mieć wszystkie wątki publikowane w kolejce/buforze i pobierać z niej jeden wątek i zapisywać do pliku. Będzie to najbardziej skalowalne i najłatwiejsze do wdrożenia rozwiązanie.
Dziennik — zapisy asynchroniczne
Jeśli potrzebujesz utworzyć pojedynczy bardzo duży plik, w którym kolejność zapisów nie ma znaczenia, a program jest powiązany z procesorem, możesz użyć techniki księgowania.
Mieć każdy process
napisz do osobnego pliku, a następnie połącz wiele plików w jeden duży plik na końcu. To bardzo stara niska technologia rozwiązanie, które działa dobrze i działa od dziesięcioleci.
Oczywiście im więcej masz we/wy pamięci, tym lepiej będzie to działać na końcowym połączeniu.