2010-01-11 12 views
19

Si inicializo un diccionario genérico una vez, y no se permiten más adiciones/actualizaciones/eliminaciones, ¿es seguro tener varios subprocesos leyendo sin bloqueo (suponiendo que el diccionario se inicializa antes de que los lectores se inicien)?Seguridad de subprocesos de un diccionario <TKey, TValue>

Hay una nota en la ayuda para la HashTable no genérico que dice que es seguro para múltiples lectores, pero no vi uno similar no fuera por el diccionario genérico

Respuesta

34

Para su referencia en el futuro, la documentación está aquí:

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

Dice:

Un diccionario puede soportar múltiples lectores concurrentemente, siempre que la colección no se modifique. Aún así, enumerando a través de una colección es intrínsecamente no es un procedimiento thread-safe. En el raro caso en que una enumeración contenga accesos de escritura , la colección debe ser bloqueada durante toda la enumeración. Para permitir el acceso a la colección por varios hilos para leer y escribir, debe implementar su propia sincronización .

+0

Solo quiero asegurarme de que entiendo que "aun así ..." parte del párrafo citado correctamente. ¿Es cierto que: (1) si el diccionario ya no se modificará (como se menciona en la pregunta del OP), la enumeración tampoco será un problema. (2) si el diccionario se modificará potencialmente en el futuro, entonces incluso la enumeración 'ConcurrentDictionary' tampoco es" intrínsecamente un procedimiento seguro para subprocesos ". ¿Correcto? – RayLuo

+0

@RayLuo: en general, no está permitido modificar una colección mientras una enumeración está "en vuelo", independientemente de si es multiproceso o de subproceso único. –

+0

Las colecciones de marcos concurrentes (por ejemplo, 'System.Collections.Concurrent.ConcurrentDictionary') generalmente permiten modificaciones durante la enumeración. Sin embargo, logran esto haciendo una copia de la colección y haciendo que enumere la copia. Y toda la colección está bloqueada mientras se realiza la copia. Un ingeniero de frameworks podría argumentar que esto significa que no está modificando la colección mientras la enumeración está "en vuelo" (ya que bajo el capó, todo estaba bloqueado mientras la enumeración estaba "en vuelo"), pero desde la perspectiva de un usuario de framework , la enumeración está en vuelo. – Brian

13

Sí, es seguro si don ya no modifico el diccionario Seguridad de los hilos es sólo un problema en los escenarios de lectura/escritura

+11

Debes tener en cuenta el estado interno. Externamente, es posible que solo esté leyendo un valor del diccionario. Sin embargo, no sabe qué transiciones de estado pueden ocurrir durante la recuperación. – JMarsch

+0

OP @JMarsch comentó anteriormente y recibió 10 votos positivos. Entonces, ¿cómo afectaría ese "estado interno" al escenario del PO? ¿Está todavía bien que 'Si inicializo un diccionario genérico una vez, y no se permiten más adiciones/actualizaciones/eliminaciones, es seguro tener múltiples hilos leyendo de él sin bloqueo (suponiendo que el diccionario se inicialice antes de que se inicien los lectores?)? ' – RayLuo

+0

Para un diccionario, sí, se encuentra la respuesta de Eric Lippert. Lo importante que debo recordar de mi comentario es que, en general, no es suficiente suponer que una estructura de datos es segura para el hilo si solo lee, ya que no sabe cómo afecta la lectura al estado interno. En el caso del diccionario, resulta que las operaciones de lectura son realmente seguras siempre y cuando nadie lo escriba mientras los lectores concurrentes lo están usando. Entonces en tu ejemplo, donde lo inicializas una vez, y luego solo lees, estás a salvo. – JMarsch

Cuestiones relacionadas