Is the following pseudocode thread-safe ?
IList dataList = SomeNhibernateRepository.GetData();
Parallel.For(..i..)
{
foreach(var item in dataLi
It's fully thread-safe as long as DoSomething(item)
doesn't modify dataList
. Since you said it doesn't, then yes, that is thread-safe.
If whay you say is correct then I would say so. But what you say or think may not what happen in reality. How can you say in code what you have said. How to enforce the constraint that List is never modified?
to make sure no one is gonna change yuor list you could access it through an IEnumerable
IEnumerable<T> dataList = SomeNhibernateRepository.GetData();
Parallel.For(..i..)
{
foreach(var item in dataList)
{
DoSomething(item);
}
}
Yes, List<T>
is fine to read from multiple threads concurrently, so long as nothing's writing.
From the documentation:
A
List<T>
can support multiple readers concurrently, as long as the collection is not modified.
EDIT: Note that your code doesn't necessarily use List<T>
- just an IList<T>
. Do you know the type returned by GetData()
? If you're in control of GetData()
you probably want to document that the list returned by it is thread-safe for reading, if it's actually returning a List<T>
.