Me pregunto si los métodos de extensión de Linq son atómicos? ¿O necesito lock
algún objeto IEnumerable
utilizado entre subprocesos, antes de cualquier tipo de iteración?¿Los métodos de IEnumerable Linq son seguros para subprocesos?
¿Decir que la variable como volatile
tiene algún efecto en esto?
En resumen, ¿cuál de las siguientes opciones es la mejor operación segura para hilos?
1- Sin ningún tipo de cerraduras:
IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
2- incluyendo las declaraciones de bloqueo:
IEnumerable<T> _objs = //...
lock(_objs)
{
var foo = _objs.FirstOrDefault(t => // some condition
}
3- Declarar variable como volátil:
volatile IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
No son seguros para subprocesos. Ver http://stackoverflow.com/questions/9995266/how-to-create-a-thread-safe-generic-list – stuartd