Ten kodCzy `const` parametry String (gwint) bezpieczny
procedure MyThreadTestA(const AStr: string);
jest szybszy niż
procedure MyThreadTestB(AStr: string);
Podczas gdy wykonywanie tej samej pracy, zarówno przekazać wskaźnik.
Jednak wersja B "poprawnie" aktualizuje wartość odniesienia o wartości AStr
i tworzy kopię, jeśli ją zmieniam.
Wersja A przekazuje tylko wskaźnik, a tylko kompilator uniemożliwia zmianę AStr
.
Wersja A nie jest bezpieczne jeśli robię brudnych sztuczek w asemblerze lub w inny sposób na obejście ochrony kompilatora, to jest dobrze znane, ale ...
przepuszcza AStr
przez referencyjne jako const
parametry wątku bezpieczne?
Co się stanie, jeśli licznik odwołań AStr
w innym wątku zostanie wyzerowany, a ciąg znaków zostanie zniszczony?
Jeśli licznik odniesień osiąga wartość zerową w innym wątku, to liczenie odwołań było początkowo nieprawidłowe. Jeśli dwa fragmenty kodu mogą modyfikować ten sam ciąg znaków, liczba odwołań do łańcucha powinna być większa niż 1, ponieważ istnieje wiele sposobów odwoływania się do tego ciągu. Każdy wątek powinien mieć swoją własną niezależną zmienną do sędziowania na łańcuch, lub też zmienna dzielona powinna być chroniona zwykłymi technikami synchronizacji. –
Bardzo dobre pytanie. Nauczyłem się czegoś dzisiaj. –