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