如果我不修改集合,则运行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);
}
答案 0 :(得分:1)
对于Dictionary<T,T>
,该文件明确指出:
字典可以同时支持多个读者, 只要未修改集合。
因此,如果您在阅读期间从不修改字典,那么可以让多个读者一次从字典中读取。
SortedSet<T>
实例成员不保证是线程安全的,如文档中所述。