Nie, to nie może być bezpieczne w przypadku niektórych sytuacji.
Widzę co najmniej dwa powody.
1. To będzie zależeć od statycznej zawartości tablicy.
Jeśli użyjesz niezwiązanych z numerem typów (np. double, integer, bytes, shortstring
), w większości przypadków nie będzie problemu (przynajmniej jeśli dane są odczytywane/tylko).
Ale jeśli używasz typów zliczanych referencyjnie (takich jak string, interface
lub zagnieżdżona dynamiczna tablica), musisz zadbać o bezpieczeństwo wątków.
Czyli:
TMyType1: array[0..1] of integer; // thread-safe on reading
TMyType2: array[0..1] of string; // may be confusing
Dodatkowa nota: jeśli string
jest w rzeczywistości wspólną wśród niektórych podgrup części statycznej tablicy, można mieć licznik odniesienia mylić. Chyba że jednoznacznie nazwiesz UniqueString()
dla każdego z nich (w sekcji krytycznej podejrzewam). W przypadku tablicy double
lub integer
ten problem nie wystąpi.
2. To będzie zależeć od współbieżności dostępu
odczytu należy wątku bezpieczne, nawet dla odniesienia liczone typu, ale równoczesny zapis może być mylące. W przypadku niektórych przypadków losowych, w szczególności na wielordzeniowym procesorze, mogą występować problemy z GPF.
Niektóre bezpieczne wdrożenie może być:
- Stosować sekcje krytyczne (mniejszy, jak to możliwe, aby zmniejszyć narzut) lub inne konstrukcje zabezpieczające;
- Użyj Kopiuj-do-zapisu lub prywatnej kopii na wątek treści, aby mieć pewność;
- Najnowsza uwaga (nie na temat bezpieczeństwa, ale wydajności): udostępnianie macierzy między wieloma procesorami może prowadzić do nakładania kar z powodu synchronizacji pamięci podręcznej między procesorami. Wydajność jest czasami o wiele lepsza, gdy używasz oddzielnych tablic, upewniając się, że ich okno buforowania L1 nie będzie współużytkowane przez procesory.
Należy pamiętać, że takie problemy mogą być koszmarem do debugowania po stronie klienta: problemy z wieloma wątkami mogą występować losowo i są bardzo trudne do śledzenia. Im bezpieczniejsze, tym lepiej, chyba że masz jednoznaczne i sprawdzone problemy z wydajnością.
Dodatkowa uwaga: Dla konkretnego przypadku statycznej macierzy podwójnej, z podelementem macierzy, do której dostęp ma tylko jeden wątek, jest bezpieczny dla wątków. Ale nie ma absolutnej zasady bezpieczeństwa nitki we wszystkich sytuacjach, nawet dla statycznej tablicy. Gdy tylko użyjesz typów zliczających referencje lub niektórych wskaźników, możesz mieć problemy losowe.
OK, wiem co to znaczy teraz. Nazwałbym to ustalonym rozmiarem, ale proszę bardzo. Nie ma znaczenia, czy rozmiar jest ustalony czy nie. Nie ma znaczenia, czy tablica ma zasięg globalny, lokalny czy klasy. Nie ma znaczenia, czy tablica jest przydzielona do sterty, czy też przydzielona do stosu. To tylko ciągły zbiór przedmiotów. –
Nie, mój błąd. Nigdy nie znałem tego użycia. Myślę, że musiało to być wprowadzone po tym, jak nauczyłem się Delphi w momencie dodawania tablic dynamicznych, ponieważ wszystkie tablice wcześniej były statyczne. W każdym razie statyczne lub nie ma żadnej różnicy. –
Wystarczająco fair. Jak pan twierdzi, w każdym razie nie wydaje się, aby istniał oczywisty powód, dla którego równoczesny dostęp powinien stanowić problem, ale czasami istnieją mroczne subtelności, które wprowadzają w błąd takie rzeczy. Czasami miło być podwójnie pewnym. –