Questo codicesono `parametri di stringa const` (thread) sicuro
procedure MyThreadTestA(const AStr: string);
è più veloce di
procedure MyThreadTestB(AStr: string);
mentre facendo lo stesso lavoro, sia passare un puntatore.
Tuttavia, la versione B 'correttamente' aggiorna il riferimento di AStr
e fa una copia se la cambio.
Versione A passa solo un puntatore e solo il compilatore mi impedisce di modificare AStr
.
Versione A non è sicuro se faccio trucchi sporchi in Assembler o in altro modo per aggirare la protezione compilatore, questo è ben noto, ma ...
viene passato AStr
per riferimento come un const
parametri thread-safe?
Cosa succede se il conteggio di riferimento di AStr
in qualche altro thread si azzera e la stringa viene distrutta?
Se il conteggio dei riferimenti va a zero in un altro thread, il conteggio dei riferimenti era sbagliato per cominciare. Se due pezzi di codice possono entrambi modificare la stessa stringa, il conteggio dei riferimenti della stringa deve essere maggiore di 1 perché esistono chiaramente diversi modi per fare riferimento a quella stringa. Ogni thread deve avere una propria variabile indipendente per l'arbitraggio della stringa, oppure la variabile condivisa deve essere protetta con le consuete tecniche di sincronizzazione. –
Ottima domanda. Ho imparato qualcosa oggi. –