二进制搜索是否线程安全

本文关键字:安全 线程 是否 搜索 二进制 | 更新日期: 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>是线程安全的,您自己的代码,就像您自己的比较器一样,可能不是线程安全的。如果您的代码不修改任何(静态)字段(或(静态)自动属性)或任何其他数据,如文件,注册表,数据库等,您可以安全地使用线程