Una colección segura para subprocesos frente a una colección no segura para subprocesos puede considerarse de una manera diferente.
Considere una tienda sin empleado, excepto al momento de pagar. Tienes muchos problemas si las personas no actúan de manera responsable. Por ejemplo, digamos que un cliente toma una lata de una lata piramidal mientras un empleado está construyendo la pirámide, todo el infierno se desataría. O, ¿qué pasa si dos clientes alcanzan el mismo artículo al mismo tiempo, quién gana? ¿Habrá una pelea? Esta es una colección no segura para subprocesos. Hay muchas maneras de evitar problemas, pero todas requieren algún tipo de bloqueo, o más bien acceso 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. Te pones en la fila y le pides un artículo, él te lo devuelve y sales de la fila. Si necesita varios artículos, solo puede recoger tantos artículos en cada viaje de ida y vuelta como pueda recordar, pero debe tener cuidado para evitar acaparar al empleado, esto enojará a los otros clientes en la fila detrás de usted.
Ahora considera esto. En la tienda con un empleado, ¿qué pasa si llegas hasta el frente de la fila y le preguntas al empleado "¿Tienes papel higiénico?", Y él dice "Sí", y luego dices "Ok, yo" me pondré en contacto contigo cuando sepa cuánto necesito ", y para cuando vuelvas a estar al frente de la fila, la tienda, por supuesto, se puede agotar. Este escenario no se evita mediante una colección segura para subprocesos.
Una colección segura para subprocesos garantiza que sus estructuras de datos internas sean válidas en todo momento, incluso si se accede desde múltiples subprocesos.
Una colección que no sea segura para subprocesos no viene con tales garantías. Por ejemplo, si agrega algo a un árbol binario en un subproceso, mientras que otro subproceso está ocupado reequilibrando el árbol, no hay garantía de que el elemento se agregará, o incluso si el árbol sigue siendo válido después, podría estar corrupto más allá de la esperanza.
Sin embargo, una colección segura para subprocesos no garantiza que todas las operaciones secuenciales en el subproceso funcionen en la misma "instantánea" de su estructura de datos interna, lo que significa que si tiene un código como este:
if (tree.Count > 0)
Debug.WriteLine(tree.First().ToString());
es posible que obtenga una NullReferenceException porque entre tree.Count
y tree.First()
, otro subproceso ha eliminado los nodos restantes en el árbol, lo que significa First()
que volverá null
.
Para este escenario, debe ver si la colección en cuestión tiene una forma segura de obtener lo que desea, tal vez necesite reescribir el código anterior o deba bloquear.