Потокобезовасный List
От: help-me  
Дата: 11.03.14 09:51
Оценка: :)
Мне нужно написать потокобезопасный список, либо как-то работать потокобезопасно с обычным списком. Сейчас у меня такая проблема, что даже обычный список без всяких 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 асинхронно, то эта лесенка должна была бы искривляться. Но почему это не происходит?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.