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