Sé que en el programa de subprocesos múltiples, necesitamos usar ConcurrentDictionary , ConcurrentBag , etc., esa colección segura para subprocesos. Pero en mi situación, la cantidad de claves en el Diccionario es fija, tengo 5 claves exactas que ya conozco antes de que se ejecute el programa para poder inicializar la clave del diccionario. Entonces, mi pensamiento es que, debido a que el número de claves no va a cambiar, puedo usar Dictionary en lugar de ConcurrentDictionary , y la razón por la que estoy pensando en hacer esto es porque la colección no cambiará de tamaño internamente, por lo que no habrá Puede ser una situación en la que thread1 intente actualizar un elemento después de que thread2 agregue un nuevo elemento y luego provoque un cambio de tamaño, lo que hace que la actualización de thread1 falle. ¿Es correcto mi entendimiento?
Más información:
No tengo un par clave/valor compartido que todos los subprocesos puedan actualizar, cada subproceso solo actualiza un par clave/valor en particular y TKey es una cadena única, TValue es un tipo de clase simple
La documentación de la clase Dictionary<TKey, TValue> establece explícitamente que:
Para permitir que varios subprocesos accedan a la colección para leer y escribir, debe implementar su propia sincronización.
Entonces, según la documentación, si modifica el diccionario por varios subprocesos sin sincronización, ha ingresado al territorio de "comportamiento indefinido". Lo que significa que "cualquier cosa" puede pasar, y pase lo que pase no será un error. Se ha incumplido la garantía, y Microsoft no podría preocuparse menos por los daños que le hayan ocurrido después de usar sus productos incorrectamente.
Dicho esto, y sabiendo cómo se implementa la clase Dictionary<TKey, TValue> , es poco probable que tenga problemas al usar Dictionary<TKey, TValue> sin bloqueo, si sigue el patrón de uso muy estricto que describe en su pregunta. Depende de usted decidir si está bien confiar en los detalles de implementación de la API que usa, en lugar de la documentación publicada.
Como nota al margen, tenga en cuenta que, en general, la búsqueda en serie de un valor en una pequeña List<T> o matriz supera la búsqueda de un valor en un pequeño Dictionary<TKey, TValue> basado en hash. El punto de inflexión depende del tipo de clave y puede ser tan grande como 50 elementos o más. También para almacenar un valor por subproceso, puede encontrar útil la clase ThreadLocal<T> .
Si
entonces no es necesario bloquear la implementación actual (es decir, el Dictionary está bien) porque el diccionario en sí no cambia y un solo consumidor accede a cada valor.
Generalmente, no está bien usar código que funciona pero usa estructuras que tienen mejores alternativas para un escenario dado. Un código como este es muy fácil de descifrar sin saberlo hasta que se implementa en un escenario de la vida real e incluso entonces es difícil descubrir el problema rápidamente.