Este códigoson `parámetros de cadena const` (rosca)
procedure MyThreadTestA(const AStr: string);
es más rápido que
procedure MyThreadTestB(AStr: string);
mientras se realiza el mismo trabajo, tanto pasar un puntero.
Sin embargo, la versión B 'correctamente' actualiza la cuenta de referencia de AStr
y hace una copia si la cambio.
La versión A solo pasa un puntero y solo el compilador me impide cambiar AStr
.
Versión A no es seguro si no hago trucos sucios en ensamblador o de otra manera de eludir la protección del compilador, esto es bien conocido, pero ...
se pasa por referencia AStr
como un const
parámetros hilo de seguridad?
¿Qué sucede si el recuento de referencias de AStr
en otro hilo pasa a cero y la cadena se destruye?
Si la cuenta de referencia va a cero en otra secuencia, entonces la cuenta de referencia fue incorrecta para comenzar. Si dos piezas de código pueden modificar la misma cadena, entonces el recuento de referencia de la cadena debería ser mayor que 1 porque hay claramente múltiples formas de referirse a esa cadena. Cada hilo debe tener su propia variable independiente para el arbitraje de la cadena, o bien la variable compartida debe protegerse con las técnicas de sincronización habituales. –
Muy buena pregunta. Aprendí algo hoy. –