0
我試圖運行兩個單獨的線程,如A和B. A和B運行在完全不同的數據上,A只需要B的一小部分數據。它們都需要全部運行。如何從線程B中檢索數據,而不是中斷B的運行。從線程檢索數據
我是新來的多線程,你能告訴我的例子嗎?
我試圖運行兩個單獨的線程,如A和B. A和B運行在完全不同的數據上,A只需要B的一小部分數據。它們都需要全部運行。如何從線程B中檢索數據,而不是中斷B的運行。從線程檢索數據
我是新來的多線程,你能告訴我的例子嗎?
這不是線程的工作方式,線程不會「擁有」數據(大部分時間)。您可以像訪問其他數據一樣訪問在另一個線程上使用或創建的數據,但這樣做可能會非常危險但。
問題是大多數數據結構不能同時從多個線程訪問(它們不是thread-safe)。有幾種方法可以解決這個問題:
lock
(或其他一些同步構造)來訪問共享資源。這樣做可以確保一次只有一個線程訪問資源,所以它很安全。這是最常用的方法(它每次都有效),它可能是最常見的解決方案,也是最容易找到的解決方案(每次訪問資源時右鎖對象只有lock
)。但它可能會損害性能,因爲它可以使線程相互等待很多。System.Collections.Concurrent
。string
是安全的。Interlocked
操作或volatile
操作。這是來自#3的大多數結構是如何在內部實現的,並且這是一種比#1更高效的解決方案。但這樣做也很困難,這就是爲什麼你應該避免它,除非你真的知道你在做什麼。你有幾個選項,它可以是所有的混淆。但最好的選擇通常是使用lock
來訪問共享資源,或者使用庫中的線程安全結構,這樣做並不困難。但是,如果你發現這還不夠,你可以選擇更先進的替代品,但很難做到正確。
「A只需要B的小部分數據」聽起來不像「A和B在完全不同的數據上運行」 – 2012-03-08 00:20:03
爲了從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
理想模式是A不會中斷B,就像收聽者一樣,必要時B將數據傳遞給A. – will 2012-03-08 16:12:16