我有2个并发任务,每个任务分别在不同的列表上工作,但BinarySearch
方法使用实现IComparer
接口的同类对象。 BinarySearch
安全吗?
谢谢。
Parralle.Invoke
()=>
{
list1.BinarySearch(item1,new class1());
},
()=
{
list2.BinarySearch(item2,new class1());
});
答案 0 :(得分:1)
看起来您的二进制搜索甚至根本不会进行交互。
据我所知,他们使用的是他们正在使用的任何类别的完全不同的实例。
除非BinarySearch
有可能触及静态变量,或者如果它们都要触及某个类的同一个实例,我认为没有任何理由让你担心。< / p>
答案 1 :(得分:1)
List<T>
不是真正的列表,而是一个可变大小的数组,使用数组作为其后备存储。 List<T>
的{{1}}重载未记录为线程安全的,也未记录为线程不安全。代码的反编译表明它们做的很少,但调用了适当的BinarySearch()
重载。对于那些重载也是如此:文档对线程安全主题保持沉默。查看代码,虽然表明它们在事物面前是线程安全的。
<强>然而... 强>
很大程度上取决于所比较的对象和正在使用的System.Array.BinarySearch()
/ IComparer
实现。有可能(虽然看起来不太可能)有关它们的某些内容可能不是线程安全的。
我认为你在这里可能很安全,但为了确保它可能值得检查。
答案 2 :(得分:1)
是的,即使list1和list2是同一个实例,List<T>
上的所有读取操作都是线程安全的。
了解更多信息:http://msdn.microsoft.com/en-us/library/vstudio/6sh2ey19(v=vs.90).aspx
请注意,即使List<T>
是线程安全的,您自己的代码(如您自己的比较器)也可能不是线程安全的。 如果您的代码不修改任何(静态)字段(或(静态)自动属性)或任何其他数据,如文件,注册表,数据库等,则可以安全地使用线程。