No, esto no podría ser seguro para subprocesos, en algunas situaciones.
Veo al menos dos razones.
1. Dependerá del contenido de la matriz estática.
Si utiliza algunos tipos contados que no son de referencia (como double, integer, bytes, shortstring
), no habrá ningún problema en la mayoría de los casos (al menos si los datos son leídos/solo).
Pero si utiliza algunos tipos contados de referencia (como string, interface
o una matriz dinámica anidada), tendrá que encargarse de la seguridad de los hilos.
Es decir:
TMyType1: array[0..1] of integer; // thread-safe on reading
TMyType2: array[0..1] of string; // may be confusing
Nota adicional: si su string
es, de hecho, compartida entre algunos sub-partes de la matriz estática, usted podría tener que confundir la cuenta de referencia. A menos que llame explícitamente al UniqueString()
para cada uno (dentro de una sección crítica, sospecho). Para una matriz de double
o integer
, no tendrá este problema.
2. dependerá de la concurrencia de acceso
acceso de lectura debe hilo de seguridad, incluso para el tipo de referencia contado, pero de escritura concurrente puede ser confuso. Para un string
, puede tener problemas GPF en algunos casos aleatorios, especialmente en una CPU multi-core.
Algunos aplicación segura puede ser:
- Use secciones críticas (más pequeño posible, para reducir la sobrecarga) u otras estructuras de protección;
- Utilice Copiar en escritura o una copia privada del contenido por hilo, para estar seguro;
- Nota más reciente (no sobre la seguridad, pero el rendimiento): Compartir una matriz entre varias CPU puede dar lugar a sanciones de rendimiento debido a la sincronización de caché entre las CPU. El rendimiento a veces es mucho mejor cuando se utilizan matrices separadas, lo que garantiza que su ventana de almacenamiento en caché L1 no se compartirá entre las CPU.
Tenga en cuenta que estos problemas pueden ser una pesadilla para depurar, en el lado del cliente: los problemas de concurrencia de subprocesos múltiples pueden ocurrir al azar y son muy difíciles de rastrear. Cuanto más seguro, mejor, a menos que tenga problemas de rendimiento explícitos y probados.
Nota adicional: Para su caso específico de matriz estática de doble, con subparte de la matriz a la que se accede solo con un subproceso, es seguro para subprocesos. Pero no existe una regla absoluta de seguridad de subprocesos en todas las situaciones, incluso para una matriz estática. Tan pronto como utilice algunos tipos contados por referencia, o algunos punteros, puede tener problemas aleatorios.
Bien, sé lo que eso significa ahora. Yo llamaría a ese tamaño fijo, pero ahí lo tienes. No importa si el tamaño es fijo o no. No importa si la matriz es de alcance global, local o de clase. No importa si la matriz está asignada en pila o asignada en pila. Es solo una matriz contigua de artículos. –
No, mi error. Nunca había sabido ese uso. Supongo que debe haber sido introducido después de que aprendí a Delphi en el momento en que se agregaron las matrices dinámicas, ya que todas las matrices anteriores eran estáticas. En cualquier caso, estático o no hace ninguna diferencia en absoluto. –
Bastante justo. Como dices, en cualquier caso, no parece haber una razón obvia de por qué el acceso concurrente debería ser un problema, pero a veces hay sutilezas oscuras que confunden tales cosas. A veces es bueno estar doblemente seguro. –