Otra pregunta de sincronización ... Espero que no se enojen;)Sincronización para lectores múltiples, escritor único?
Supongamos el siguiente escenario: una estructura de datos central (muy grande, por lo que realmente no quiero que sea inmutable y copiarlo) cada vez que ocurre un cambio. Incluso no quiero mantener múltiples copias en la memoria), múltiples hilos de lectura que acceden a esa estructura de datos de solo lectura y una secuencia de escritura que mantiene la estructura de datos actualizada en segundo plano.
Actualmente sincronizo todos los accesos a la estructura de datos, que funciona muy bien (sin efectos de sincronización, sin interbloqueos). Lo que no me gusta de este enfoque es que la mayoría de las veces tengo muchos hilos de lectura activos y el hilo del escritor solo está activo de vez en cuando. Ahora es completamente innecesario que los hilos del lector esperen a que otros subprocesos del lector finalicen. Podrían acceder fácilmente a la estructura de datos en paralelo siempre que el hilo del escritor no esté escribiendo en ese momento.
¿Hay alguna manera agradable y elegante de resolver este tipo de situaciones?
EDIT: Muchas gracias por las respuestas y los enlaces! Permítanme agregar solo otra pregunta breve y relacionada: si el código ejecutado dentro de las secciones críticas del lector toma solo un tiempo muy corto (como solo una búsqueda en una tabla hash), ¿vale la pena considerar implementar una de las técnicas que describe o la serialización? efecto de las cerraduras no tan mal en este caso? La escalabilidad y el rendimiento son muy importantes. ¿Qué piensas?
EDIT 2: Acabo de examinar una implementación de un solo escritor/múltiples lectores - bloqueo y esta implementación utiliza un monitor para sincronizar algunos códigos en el método WaitToRead. ¿No causa esto el mismo efecto de serialización que quería evitar en primer lugar? (Aún suponiendo que el código que se sincronizará es corto y rápido)
Tenga en cuenta que esa clase está fatalmente rota en algunas versiones de Delphi. Se corrigió a partir de Delphi 2005, quizás antes. –