c# - Can a collection be modified by another thread during ToList() -
this question has answer here:
class sample { private list<int> _list; public list<int> list { { return _list.select(p => p + p).where(q => q % 2 == 0).tolist(); } } public void add(int n) { _list.add(n); } public void remove(int n) { _list.remove(n); } }
i have situation similar above in multithreaded environment add
, remove
, list
accessed multiple threads simultaneously.
in cases collection modified; enumeration operation may not execute
thrown in list
getter, makes sense threads can add/remove while select/where operations executing.
can list modified thread during call tolist()
? meaning, changing getter to
return _list.tolist().select(p => p + p).where(q => q % 2 == 0);
be enough, or need resort locks around access _list
there's no multi-threading protection in list<t>
, yes, thread could modify list during tolist
call. results be:
- everything's fine, , resulting list has new value
- everything's fine, , resulting list doesn't have new value
- it sets hard disk on fire (or other undefined behaviour)
basically, not safe use list<t>
multiple threads without external synchronization, unless all threads reading it. either need synchronization (e.g. using synchronizedcollection<t>
instead of list<t>
, or handling synchronization yourself), or concurrent collection such concurrentbag<t>
.
Comments
Post a Comment