Dictionary和SortedSet线程对于C#中的READERS是否安全?

时间:2015-03-13 21:04:33

标签: c# multithreading thread-safety enumerator

如果我不修改集合,则运行2个线程是安全的

        foreach (var el in collection)
            Console.Write(el);

同时? 文档有点含糊不清。他们确实说 - “不是线程安全”,但不清楚它们是否是READER线程安全。

MSDN说: “为了允许多个线程访问集合以进行读写,您必须实现自己的同步。”

仅仅是为了阅读?

我做了一个沉重的重击测试,希望能抓住线程践踏彼此,但到目前为止List,Dictionary和SortedSet似乎都没有被多个读者列举的混淆。不足以宣布他们的线程安全阅读,但一些思考的食物。

    SortedSet<int> m_List = new SortedSet<int>();        

    void Test()
    {
        // Put 10,000,000 integers into a collection
        for (int i = 1; i < 10000000; i++)
            m_List.Add(i);

        // Start 10 threads 
        for (int i = 1; i < 10; i++)
            (new Thread(Act)).Start(i);
    }

    Random rand = new Random();

    private void Act(object id)
    {
        Console.WriteLine("---- Started Thread: {0}", id);

        int i = 0;
        int r = rand.Next(10000);

        foreach (int j in m_List)
        {
            if (j != ++i) // the thread safety check:
            {
                Console.WriteLine("NOT THREAD SAFE!!!!!!!!!!!!");
            }

            if (j%10000 == r)
            {
                //Console.WriteLine("{0} yeld at {1}", state, j);
                Thread.Yield(); // to encourage threads intermingling.
            }

        }
        Console.WriteLine("---- Finished Thread: {0}", id);
    }

1 个答案:

答案 0 :(得分:1)

对于Dictionary<T,T>,该文件明确指出:

  

字典可以同时支持多个读者,   只要未修改集合

因此,如果您在阅读期间从不修改字典,那么可以让多个读者一次从字典中读取。

SortedSet<T>实例成员不保证是线程安全的,如文档中所述。