Una colección multi-hilo frente a un no-hilo-recolección puede considerarse de una manera diferente.
Considérese una tienda con ningún empleado, excepto al momento de pagar. Tienes un montón de problemas si las personas no actúan responsablemente. Por ejemplo, digamos que un cliente toma una lata de una lata de pirámide mientras un empleado está construyendo la pirámide, todo el infierno se desataría. O bien, ¿qué pasa si dos clientes alcanzan el mismo artículo al mismo tiempo, quién gana? ¿Habrá una pelea? Esta es una colección sin hilos. Hay muchas maneras de evitar problemas, pero todos requieren algún tipo de bloqueo, o acceso más bien explícito de una forma u otra.
Por otro lado, considere una tienda con un empleado en un escritorio, y solo puede comprar a través de él. Usted se pone en línea y le pide un artículo, se lo devuelve y se sale de la fila. Si necesita varios artículos, solo puede recoger tantos artículos en cada viaje de ida y vuelta como lo recuerde, pero debe tener cuidado para evitar acaparar al empleado, esto enojará a los otros clientes detrás de usted.
Ahora considere esto. En la tienda con un empleado, ¿qué sucede si llega hasta el frente de la fila y pregunta al empleado "¿Tiene papel higiénico?", Y él responde "Sí", y luego dice "Ok, yo". Me pondré en contacto contigo cuando sepa cuánto necesito ", entonces, cuando vuelvas a estar al frente de la línea, la tienda puede agotarse. Esta situación no se previene con una colección segura.
Una colección threadsafe garantiza que sus estructuras de datos internos son válidos en todo momento, incluso si accede desde varios subprocesos.
Una colección que no es para roscar no viene con tales garantías. Por ejemplo, si agrega algo a un árbol binario en un hilo, mientras otro hilo está ocupado reequilibrando el árbol, no hay garantía de que el elemento se agregará, o incluso que el árbol sigue siendo válido después, podría estar dañado más allá de toda esperanza.
Una colección multi-hilo no obstante, garantiza que las operaciones secuenciales en el hilo de todo el trabajo en la misma "instantánea" de su estructura interna de datos, lo que significa que si usted tiene un código como éste:
if (tree.Count > 0)
Debug.WriteLine(tree.First().ToString());
puede obtener una NullReferenceException porque entre medio y tree.Count
tree.First()
, otro hilo ha limpiado el resto de nodos en el árbol, lo que significa First()
volverá null
.
Para este escenario, o necesita ver si la colección en cuestión tiene una forma segura de obtener lo que desea, tal vez necesita volver a escribir el código anterior, o puede que necesite bloquear.
Es posible que desee ver [este artículo del proyecto de código sobre el tema] (http: //www.codeproject.com/Articles/548406/Dictionary-plus-Locking-versus-ConcurrentDictionar) – nawfal