2011-12-22 72 views
0

這是一個非常概念性的問題。做2線程交互互相減慢?

比方說,我有2個獨立的線程。線程A不斷獲取時間並將其存儲爲變量,線程B不斷從線程B的變量中獲取時間並對其進行處理。

當線程B訪問線程A中的變量時,線程A是否停止運行直到操作完成?

要展開,如果您有3個線程,線程A獲取當前時間並將其設置爲線程B中的變量,然後線程C讀取該變量,會發生什麼情況。

如果線程A正在分配變量的中間,線程C開始讀取它,那麼線程是否停止運行直到A完成?

感謝您的偉大答案,但現在我還有1個問題。如果他們會干涉,那麼在通信時多線程不會競爭的首選解決方案是什麼? (概念上)你會怎樣做才能讓這些線程分享變量的價值,同時保持儘可能快的速度?

+0

你是什麼意思「線程A中的變量」?你的意思是一個線程局部變量? –

回答

4

記憶和thrads是兩個完全不同的東西。即使是表示線程的類的一部分的變量,也是任何線程都可以訪問的內存。

但是,這會導致處理器緩存變得複雜化:處理器緩存:爲了使在不同CPU上運行的兩個線程訪問同一塊內存並「看到」彼此的變化,CPU緩存必須是同步的,如果它發生很多,這可以完全否定這些高速緩存的(大規模)速度優勢。

請注意,由於高速緩存的原因,線程B實際上可能會在任意長的時間內看到該變量的過時值,除非這兩者都訪問同步塊內的變量,或者該變量是使用關鍵字volatile聲明的。

0

這取決於操作系統和CPU的數量,但基本上是的,當一個線程工作時,另一個等待。如果線程B使用線程A使用的變量,那麼它並不重要,因爲它們共享相同的內存。

3

通常不會,除非您聲明getter和setter同步。如果setter從一個線程被調用,另一個線程想要訪問getter,它必須等待另一個線程先結束他的任務。

我希望我能理解這個問題。

0

是的,他們放慢了速度。

這是因爲你的併發性檢查你在應用程序中編碼:因爲你有一個鎖,信號量,監視器,或者其他什麼,調節對存儲變量的訪問,每個線程可能會等待獲得獨佔訪問讀/編寫變量。

即使您沒有併發檢查,我也很確定內存不允許同時讀取或讀取/寫入:因爲這種情況可能發生,您的線程將被迫減慢一點點但是

1

它不會使線程B慢線程A下來。

但是:
1.線程A可能會減慢線程B.根據系統架構(核心和高速緩存),線程A的每次寫入都會清除線程B的CPU的高速緩存線。 B的下一次閱讀會更加昂貴。
2.如果使用鎖來保護數據結構,則兩個線程都必須獲取它。那麼,顯然,線程A會放慢速度。
3.如果您沒有使用鎖定,並且您的數據類型不是原子的,則可能會讀取損壞的數據。例如,如果時間從0x0000ffff更改爲0x00010000,則可能會讀取0x0001ffff。通常情況下,一個4字節對齊的整數是原子的,所以如果你的時間是time_t,你可能就沒問題了。但細節依賴於平臺。