Tengo un diccionario que se rellena una vez en un constructor estático y no se modifica desde entonces. Quiero que varios hilos puedan leer valores de esta colección. ¿Necesito algún bloqueo aquí?C# lectura de varios subprocesos de colecciones no modificables
Respuesta
According to Microsoft's documentation, la clase de diccionario puede admitir varios lectores al mismo tiempo, siempre que la colección no se modifique. Por lo tanto, no se requieren bloqueos.
No. El bloqueo solo es necesario cuando tiene la posibilidad de entrelazar múltiples escrituras o escrituras con lecturas. La lectura solamente, sin cambios en absoluto, no introduce la posibilidad de que lo que está haciendo un hilo afecte a lo que otro hilo está haciendo.
Tenga en cuenta que esto no requiere escrituras, en absoluto. Si, por ejemplo, estás usando un objeto y lo lees de alguna manera modifica el estado interno del objeto como un efecto secundario, entonces necesitarías tener el bloqueo todavía.
Aunque esto está documentado como el caso de un objeto de diccionario específico, esto no es cierto para los objetos de diccionario en general. Imagine, por ejemplo, un objeto de diccionario que cuando lee de él, reorganiza su estructura interna para que el objeto recién leído se mueva al principio de la lista de cubos de hash, para que la próxima vez que se lea, sea más rápido. Muchos diccionarios escritos para compiladores tienen esta propiedad porque si busca "WriteLine" dentro de "Console" una vez, las probabilidades son buenas, está a punto de buscarlas nuevamente. Eso significa que las lecturas pueden causar mutaciones que podrían no ser seguras para hilos. –
@Eric - justo, y cierto. Eliminé la palabra "personalizado" de mi segundo párrafo porque, como señaló, muchos objetos marco también lo hacen. – Donnie
Editar: Parece que los documentos dicen que esta clase es segura para leer. Pero si la respuesta a continuación aún no se aplica, ya que no puede asumir que su lectura solo es de lectura solo para la clase.
La respuesta corta es sí. A menos que la clase diga que es seguro para subprocesos. Hay muchas cosas que podría estar haciendo que no son seguras para hilos.
Es probable que no cause problemas pero la clase podría estar usando variables internas de una manera que podría causar condiciones de carrera. También podría estar llamando a otras clases que no son seguras para subprocesos. A menos que compruebe que el código de los documentos dice que está bien, no es seguro suponerlo.
Por ejemplo, puede pensar que es de solo lectura pero la clase que intenta acelerar puede almacenar en caché el último elemento al que se accedió y que implica escribir datos. Eso podría fallar y causar que recuperes un artículo diferente de lo esperado.
Una vez más, no creo que sea probable, pero a menos que la clase diga que es seguro para subprocesos, es peligroso asumirlo.
¿Esto significa que si cambio algunas propiedades de un objeto contenido en el Diccionario puedo obtener una excepción? –
Debe PRUEBA CON EXACTITUD, pero muchas colecciones se pueden leer al mismo tiempo de forma segura incluso si no están etiquetadas como "seguro para subprocesos". Asumir que es peligroso puede conducir a un peor rendimiento sin ninguna ganancia. – Donnie
@ user375487: Es probable que no obtenga una excepción, pero puede obtener un comportamiento extraño. Debe bloquear el objeto que está modificando, ya que es posible que más de un subproceso intente cambiarlo al mismo tiempo. – Donnie
- 1. Lectura de un único archivo de varios subprocesos en python
- 2. Varios subprocesos: ¿debo bloquear los datos de lectura?
- 3. Sólo lectura Diccionario - varios subprocesos llamando .ContainsKey método
- 4. Comprensión de varios subprocesos
- 5. Crear archivos no modificables
- 6. API de colecciones de Java: ¿por qué las clases [Lista | Establecer | Mapa] no son modificables?
- 7. Colecciones de solo lectura de Entity Framework
- 8. Transacción de Entity Framework con varios subprocesos
- 9. ¿Usarás varios subprocesos con un rendimiento de ayuda de RandomAccessFile?
- 10. Boost Puntero compartido: acceso de lectura simultáneo a través de varios subprocesos
- 11. Consola de llamada.WriteLine de varios subprocesos
- 12. ¿Por qué la lectura no es segura para subprocesos?
- 13. ¿Es seguro leer de varios subprocesos?
- 14. Decapado de varios subprocesos en Python
- 15. ¿Realmente Node.js usa varios subprocesos debajo?
- 16. Java: sincronización de subprocesos en varios servidores
- 17. Comparación de colecciones C++ STL y colecciones C#?
- 18. ¿Dónde poner archivos comunes de aplicaciones modificables?
- 19. cómo descargar un solo archivo con varios subprocesos en C#
- 20. ¿Por qué Parallel.ForEach no está ejecutando varios subprocesos?
- 21. No se puede operar ObservableCollection en varios subprocesos
- 22. Espere al final de los subprocesos con varios trabajos paralelos
- 23. ICollection, colecciones de solo lectura y sincronización. ¿Es esto correcto?
- 24. Filtrado de colecciones en C#
- 25. Lectura rápida de ciertos bytes de varios archivos en C/C++
- 26. consulta SQL - deshacerse de los valores no modificables
- 27. Ejecutar tareas en varios subprocesos en node.js
- 28. Depuración de subprocesos C#
- 29. C + + sobrecarga de subprocesos
- 30. Bloquear un objeto para que no sea accedido por varios subprocesos - Objective-C
No tengo idea de por qué más personas no revisan los documentos. Es el primer lugar donde todos deberían mirar. ¿Por qué le preguntas al mundo cuándo puedes preguntarle a los tipos que escribieron el código? :) +1 –
@KierenJohnstone La razón es porque las personas generalmente gravitan hacia lo que funciona. Los documentos me han enseñado a no mirar en ellos a excepción de la información más superficial. I * used * para buscar primero este tipo de respuestas. Debido a que generalmente no están allí, ya no miro allí primero.(Pregunto a Google; Google me trae aquí; ¡me alegro de que Google me haya traído aquí en lugar de los documentos!) :) – pettys
Sin embargo, alguien notó el siguiente comentario en los documentos, después de que "la lectura es segura": "Aún así, enumerar a través de una colección no es intrínsecamente un procedimiento seguro para hilos ". – dcg