2010-07-10 12 views

Respuesta

14

According to Microsoft's documentation, la clase de diccionario puede admitir varios lectores al mismo tiempo, siempre que la colección no se modifique. Por lo tanto, no se requieren bloqueos.

+2

No tengo idea de por qué más personas no revisan los documentos. Es el primer lugar donde todos deberían mirar. ¿Por qué le preguntas al mundo cuándo puedes preguntarle a los tipos que escribieron el código? :) +1 –

+2

@KierenJohnstone La razón es porque las personas generalmente gravitan hacia lo que funciona. Los documentos me han enseñado a no mirar en ellos a excepción de la información más superficial. I * used * para buscar primero este tipo de respuestas. Debido a que generalmente no están allí, ya no miro allí primero.(Pregunto a Google; Google me trae aquí; ¡me alegro de que Google me haya traído aquí en lugar de los documentos!) :) – pettys

+0

Sin embargo, alguien notó el siguiente comentario en los documentos, después de que "la lectura es segura": "Aún así, enumerar a través de una colección no es intrínsecamente un procedimiento seguro para hilos ". – dcg

2

No. El bloqueo solo es necesario cuando tiene la posibilidad de entrelazar múltiples escrituras o escrituras con lecturas. La lectura solamente, sin cambios en absoluto, no introduce la posibilidad de que lo que está haciendo un hilo afecte a lo que otro hilo está haciendo.

Tenga en cuenta que esto no requiere escrituras, en absoluto. Si, por ejemplo, estás usando un objeto y lo lees de alguna manera modifica el estado interno del objeto como un efecto secundario, entonces necesitarías tener el bloqueo todavía.

+0

Aunque esto está documentado como el caso de un objeto de diccionario específico, esto no es cierto para los objetos de diccionario en general. Imagine, por ejemplo, un objeto de diccionario que cuando lee de él, reorganiza su estructura interna para que el objeto recién leído se mueva al principio de la lista de cubos de hash, para que la próxima vez que se lea, sea más rápido. Muchos diccionarios escritos para compiladores tienen esta propiedad porque si busca "WriteLine" dentro de "Console" una vez, las probabilidades son buenas, está a punto de buscarlas nuevamente. Eso significa que las lecturas pueden causar mutaciones que podrían no ser seguras para hilos. –

+0

@Eric - justo, y cierto. Eliminé la palabra "personalizado" de mi segundo párrafo porque, como señaló, muchos objetos marco también lo hacen. – Donnie

1

Editar: Parece que los documentos dicen que esta clase es segura para leer. Pero si la respuesta a continuación aún no se aplica, ya que no puede asumir que su lectura solo es de lectura solo para la clase.


La respuesta corta es sí. A menos que la clase diga que es seguro para subprocesos. Hay muchas cosas que podría estar haciendo que no son seguras para hilos.

Es probable que no cause problemas pero la clase podría estar usando variables internas de una manera que podría causar condiciones de carrera. También podría estar llamando a otras clases que no son seguras para subprocesos. A menos que compruebe que el código de los documentos dice que está bien, no es seguro suponerlo.

Por ejemplo, puede pensar que es de solo lectura pero la clase que intenta acelerar puede almacenar en caché el último elemento al que se accedió y que implica escribir datos. Eso podría fallar y causar que recuperes un artículo diferente de lo esperado.

Una vez más, no creo que sea probable, pero a menos que la clase diga que es seguro para subprocesos, es peligroso asumirlo.

+0

¿Esto significa que si cambio algunas propiedades de un objeto contenido en el Diccionario puedo obtener una excepción? –

+0

Debe PRUEBA CON EXACTITUD, pero muchas colecciones se pueden leer al mismo tiempo de forma segura incluso si no están etiquetadas como "seguro para subprocesos". Asumir que es peligroso puede conducir a un peor rendimiento sin ninguna ganancia. – Donnie

+0

@ user375487: Es probable que no obtenga una excepción, pero puede obtener un comportamiento extraño. Debe bloquear el objeto que está modificando, ya que es posible que más de un subproceso intente cambiarlo al mismo tiempo. – Donnie

Cuestiones relacionadas