Zastanawiam się, czy metody rozszerzenia Linq są atomowe? Czy potrzebuję do lock
dowolnego obiektu IEnumerable
używanego w wątkach przed jakąkolwiek iteracją?Czy wielokrotne metody Linq są wątkowe?
Czy zadeklarowanie zmiennej jako volatile
ma na to jakiś wpływ?
Podsumowując, która z poniższych jest najlepsza, bezpieczne dla wątków, operacja?
1- Bez zamków:
IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
2- tym oświadczenia blokady:
IEnumerable<T> _objs = //...
lock(_objs)
{
var foo = _objs.FirstOrDefault(t => // some condition
}
3- zgłaszania zmiennych jak lotne:
volatile IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
Nie są bezpieczne dla wątków. Zobacz http://stackoverflow.com/questions/9995266/how-to-create-a-thread-safe-generic-list – stuartd