0

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

谢谢你。

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

3 回答 3

1

看起来您的二进制搜索甚至根本没有交互。

据我所知,他们使用的任何类的实例都完全不同。

除非有机会BinarySearch接触到一个静态变量,或者如果它们都接触到某个类的同一个实例,我看不出有什么让你担心的理由。

于 2013-05-08T20:47:00.393 回答
1

AList<T>不是一个真正的列表,而是一个可变大小的数组,它使用一个数组作为其后备存储。的List<T>重载BinarySearch()没有记录为线程安全的,也没有记录为线程不安全的。代码的反编译表明它们几乎没有做任何事情,只是调用了适当的System.Array.BinarySearch()重载。对于这些重载也是如此:文档对线程安全的主题保持沉默。查看代码,尽管从表面上看它们是线程安全的。

然而...

很大程度上取决于被比较的对象和使用的IComparer/IComparer<T>实现。有可能(尽管看起来不太可能)关于它们的某些东西可能不是线程安全的。

我认为你在这里可能很安全,但可能值得检查一下,只是为了确定。

于 2013-05-08T20:52:38.243 回答
1

是的,即使 list1 和 list2 是同一个实例,a 上的所有读取操作List<T>都是线程安全的。

欲了解更多信息: http: //msdn.microsoft.com/en-us/library/vstudio/6sh2ey19 (v=vs.90).aspx

请注意,即使List<T>是线程安全的,您自己的代码(如您自己的比较器)也可能不是线程安全的。如果您的代码不修改任何(静态)字段(或(静态)自动属性)或任何其他数据,如文件、注册表、数据库等,那么您可以安全地使用线程。

于 2013-05-08T20:54:02.100 回答