Мне нужно написать потокобезопасный список, либо как-то работать потокобезопасно с обычным списком. Сейчас у меня такая проблема, что даже обычный список без всяких lock работает потокобезопасно 0_0 (хотя, он не должен быть потокобезопасным). Как такое может быть? Здесь что-то не так?
Вот мой код, которым я проверял список , получая к нему доступ из разных потоков
class Program
{
static List<string> store = new List<string>(100);
static void Main(string[] args)
{
//TEST
List<string> newList = new List<string>(2);
for (int i = 0; i < 10; i++)
{
string s = "";
for (int k = 0; k < i; k++)
{
s += " ";
}
for (int k = 0; k < 10; k++)
{
newList.Add(s + k.ToString());
}
}
store.AddRange(newList);
Thread[] thrs = new Thread[5];
List<List<string>> ress = new List<List<string>>();
for (int i = 0; i < 5; i++)
{
thrs[i] = new Thread(() => { ress.Add(GetCompanies2()); });
}
for (int i = 0; i < 5; i++)
{
thrs[i].Start();
}
Console.Read();
foreach (var res in ress)
{
res.ForEach(k => Console.WriteLine(k));
Console.WriteLine("end---------------------");
}
Console.Read();
Console.Read();
}
//TEST
public static List<string> GetCompanies2()
{
List<string> aaa = new List<string>();
foreach (var VARIABLE in store)
{
Thread.Sleep(10);
aaa.Add(VARIABLE);
}
return aaa;
}
}
я даже поставил Thread.Sleep(10), чтобы убеждаться, что каждый поток не выполнит проход по foreach быстрее, чем запустятся другие потоки. По идее, каждый поток должен двигать Ienumerable.MoveNext в foreach и Ienumerable.Current должен отдавать не всегда последовательные значения из списка, но почему-то у меня всегда получается в консоли такая идеально ровная лесенка (каждая ступень из 10 элементов)
http://screencast.com/t/hW7Z9n8T .
Если бы потоки двигали Ienumerable.MoveNext асинхронно, то эта лесенка должна была бы искривляться. Но почему это не происходит?