二进制搜索线程安全吗?

时间:2013-05-08 20:39:49

标签: c# multithreading

我有2个并发任务,每个任务分别在不同的列表上工作,但BinarySearch方法使用实现IComparer接口的同类对象。 BinarySearch安全吗?

谢谢。

Parralle.Invoke
()=>
{
    list1.BinarySearch(item1,new class1());
},
()=
{
    list2.BinarySearch(item2,new class1());
});

3 个答案:

答案 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>是线程安全的,您自己的代码(如您自己的比较器)也可能不是线程安全的。 如果您的代码不修改任何(静态)字段(或(静态)自动属性)或任何其他数据,如文件,注册表,数据库等,则可以安全地使用线程。