2011-08-05 8 views
25

¿El siguiente pseudocódigo es seguro para subprocesos?¿La lista es <T> segura para lectura de subprocesos?

IList<T> dataList = SomeNhibernateRepository.GetData(); 

Parallel.For(..i..) 
{ 
    foreach(var item in dataList) 
    { 
     DoSomething(item); 
    } 
} 

La lista nunca cambia, solo se repite y se lee en paralelo. No escribir en campos o algo así.

Gracias.

Respuesta

38

Sí, List<T> está bien para leer de varios subprocesos al mismo tiempo, siempre y cuando nada esté escribiendo.

De the documentation:

Un List<T> puede soportar múltiples lectores al mismo tiempo, siempre y cuando no se modifique la colección.

EDIT: Tenga en cuenta que el código no necesariamente uso List<T> - sólo una IList<T>. ¿Conoce el tipo devuelto por GetData()? Si tiene el control de GetData(), probablemente desee documentar que la lista devuelta por ella es segura para la lectura de subprocesos, si realmente está devolviendo un List<T>.

3

Es completamente seguro para subprocesos siempre que DoSomething(item) no modifique dataList. Como dijiste que no, entonces sí, eso es seguro para subprocesos.

0

Si lo que dice es correcto, entonces le diría que sí. Pero lo que dices o piensas puede no suceder en la realidad. ¿Cómo puedes decir en código lo que has dicho? ¿Cómo hacer cumplir la restricción de que la Lista nunca se modifica?

+3

que es relativamente fácil: que sea un miembro privado en una clase que sólo lleva a cabo el acceso de lectura a la lista, posiblemente exponiendo los valores a través de otros miembros. La clase necesita mantenerse bajo control, pero es una sola pieza de código a tener en cuenta. –

1

para asegurarse de que nadie se va a cambiar yuor lista se podía acceder a él a través de un IEnumerable

IEnumerable<T> dataList = SomeNhibernateRepository.GetData(); 

Parallel.For(..i..) 
{ 
    foreach(var item in dataList) 
    { 
     DoSomething(item); 
    } 
} 
+0

Eso aún se puede devolver a una lista . Puede devolver la lista .AsReadOnly(), pero aun así la lista original es accesible con la reflexión. – Janiels

+1

si devuelve la lista , usted todavía no puede modificar la lista original Si está considerando la reflexión, también podría eludir los controles de tiempo de ejecución. ¿cómo puedes hacer que un campo sea privado? puede anwer con la clave privada. Puedo responderte con el reflejo de que puedo acceder a él. –

Cuestiones relacionadas