2012-03-08 44 views
0

我試圖運行兩個單獨的線程,如A和B. A和B運行在完全不同的數據上,A只需要B的一小部分數據。它們都需要全部運行。如何從線程B中檢索數據,而不是中斷B的運行。從線程檢索數據

我是新來的多線程,你能告訴我的例子嗎?

+4

「A只需要B的小部分數據」聽起來不像「A和B在完全不同的數據上運行」 – 2012-03-08 00:20:03

+0

爲了從B訪問數據,您需要中斷B一段時間。如果你不想這樣做,那就試着讓線程獨立(或者至少試着讓並行性變得粗糙或者尷尬)。 http://en.wikipedia.org/wiki/Parallel_computing#Fine-grained.2C_coarse-grained.2C_and_mbrassing_parallelism – eboix 2012-03-08 00:24:16

+0

理想模式是A不會中斷B,就像收聽者一樣,必要時B將數據傳遞給A. – will 2012-03-08 16:12:16

回答

2

這不是線程的工作方式,線程不會「擁有」數據(大部分時間)。您可以像訪問其他數據一樣訪問在另一個線程上使用或創建的數據,但這樣做可能會非常危險

問題是大多數數據結構不能同時從多個線程訪問(它們不是thread-safe)。有幾種方法可以解決這個問題:

  1. 使用lock(或其他一些同步構造)來訪問共享資源。這樣做可以確保一次只有一個線程訪問資源,所以它很安全。這是最常用的方法(它每次都有效),它可能是最常見的解決方案,也是最容易找到的解決方案(每次訪問資源時右鎖對象只有lock)。但它可能會損害性能,因爲它可以使線程相互等待很多。
  2. 不要在線程之間共享數據。如果您有多個並行運行的操作,有些需要資源A,另一些需要資源B,需要在一個線程上運行需要A的資源,而在另一個線程上運行需要B的資源。這樣,您可以確保只有一個線程訪問A或B,因此它是安全的。這是另一個變體,如果每個線程都有資源的副本。
  3. 使用特殊的線程安全數據結構。例如在.Net 4中,有一個線程安全集合的整個名稱空間:System.Collections.Concurrent
  4. 使用不可變的數據結構。如果結構沒有改變,可以同時從多個線程訪問它。例如,由於這個原因,在幾個線程之間共享一個string是安全的。
  5. 使用避免鎖定的特殊構造,如Interlocked操作或volatile操作。這是來自#3的大多數結構是如何在內部實現的,並且這是一種比#1更高效的解決方案。但這樣做也很困難,這就是爲什麼你應該避免它,除非你真的知道你在做什麼。

你有幾個選項,它可以是所有的混淆。但最好的選擇通常是使用lock來訪問共享資源,或者使用庫中的線程安全結構,這樣做並不困難。但是,如果你發現這還不夠,你可以選擇更先進的替代品,但很難做到正確。