2013-05-08 27 views
0

我有兩個併發任務,每一個分別在不同的列表上工作,但BinarySearch方法使用實現了IComparer接口的同一類的對象。 BinarySearch工作安全嗎?是二分搜索線程安全的嗎?

謝謝。

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

只要您不修改任何數據,它就是線程安全的。但是,在二分搜索中執行多項任務不會爲您提供任何額外的性能優勢。 – 2013-05-08 20:43:06

+0

如果沒有項目被更新(並且比較器不會突然使用實例變量或其他共享狀態),則沒有問題。 – user2246674 2013-05-08 20:43:16

+0

除非你是線程正在觸摸內存的相同部分,我沒有看到任何它不安全的原因 – 2013-05-08 20:44:46

回答

1

它看起來不像你的二進制搜索甚至是互動。

據我所知,他們用他們使用任何類的完全不同的情況。

除非有可能BinarySearch要接觸一個靜態變量,或者如果他們都要碰到某個類的同一個實例,我沒有看到任何理由讓您擔心。

+0

BinarySearch如何觸摸一個靜態變量? – 2013-05-08 20:54:57

+0

@MartinMulder自定義比較器可以。 – Servy 2013-05-08 20:56:06

+0

確實如此,但它不是'BinarySearch'這就是它,它是程序員的代碼。觸摸一個靜態變量不會自動使線程不安全。 – 2013-05-08 20:58:39

1

List<T>是不是一個真正的列表,但可變大小的陣列,使用數組作爲它的後備存儲。 BinarySearch()List<T>重載沒有記錄爲線程安全的,也沒有記錄爲線程不安全。代碼的反編譯顯示它們做的很少,但調用適當的System.Array.BinarySearch()過載。這些重載也是如此:文檔沒有提到線程安全的問題。查看代碼,儘管顯示它們在事物的表面上是線程安全的。

但是...

這在很大程度上取決於被比較的對象和所使用的IComparer/IComparer<T>實施。有可能(儘管看起來不太可能)關於它們的東西可能不是線程安全的。

我想你可能是安全的在這裏,但它可能是值得一試的事情,只是要確定。

1

是,即使列表1和List2是相同的實例,所有讀上List<T>操作是線程安全的。

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

要注意的是,即使List<T>是線程安全的,你自己的代碼,你自己喜歡的比較器,可能不會是線程安全的。 如果您的代碼不修改任何(靜態)字段(或(靜態)自動屬性)或任何其他數據(如文件,註冊表,數據庫等),則可以安全地使用線程。

+0

請注意,從技術上講,比較器可能具有導致無線程安全行爲的副作用。這不太可能,但是你不能說這代碼有競爭條件是不可能的。 – Servy 2013-05-08 20:55:18

+0

@Servy:謝謝!我更新了我的答案。 – 2013-05-08 20:57:04

+0

除了修改靜態變量之外,還有一些方法可以在代碼中創建競爭條件。可能有自定義比較器的字段(雖然這通常是一個可怕的想法),可能會修改註冊表值,平面文件,數據庫,Web服務,一個或兩個實際對象的變異(可能是最不可能的荒謬之一在這個列表中,但仍然是一個可怕的想法)等等。(對不起,如此迂腐,它只是你編輯你最後一次最糟糕的答案;我會留下它,因爲它是通過模糊的「某些不安全的東西」 ) – Servy 2013-05-08 21:09:27