Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

162
Vistas
¿Está bien usar Dictionary en lugar de ConcurrentDictionary en un programa de subprocesos múltiples cuando el número de claves es fijo?

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

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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> .

over 4 years ago · Santiago Trujillo Denunciar

0

Resumen

  1. Funcionará.
  2. Confiar en la implementación actual se considera una mala práctica. Evitalo si puedes.
  3. La optimización temprana se considera una mala práctica. Use la opción más segura y reevalúe solo si se confirma que es demasiado lento.
  4. Un diccionario compartido parece una opción interesante aquí: no parece agregar ninguna funcionalidad a su solución. Una solución diferente (por ejemplo, 5 variables) funcionaría mejor aquí.

Realmente lo quiero. ¿Puedo? Sí, pero.

Si

  1. las teclas del diccionario nunca cambian y
  2. solo un hilo accede al valor de una clave dada

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.

¿Está bien? Realmente no

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda