2010-06-13 88 views

回答

9

如果你的假設成立,那就沒有問題了。

+0

如果他的假設成立,問題不是問題嗎? (它可能不會,請參閱guffa的答案:http://stackoverflow.com/questions/3033425/are-simultaneous-reads-of-a-variable-thread-safe/3033439#3033439) – Kris 2010-06-13 18:48:08

+0

即使目前沒有寫入,前一個權利可能尚未對所有創建競賽條件的線索都可見。查看我的答案瞭解更多詳情。 – JaredPar 2010-06-13 19:02:07

+1

@Kris,@JaredPar:確實如此,但我正在回答OP所述的問題。 :-) – 2010-06-13 19:17:12

0

鑑於數據庫通常可以使用shared read locks,其中任何數量的客戶端可能會讀取同一個塊,我建議不存在直接的固有問題。

0

有三個字符。

編輯: 哎呦。是的,它是線程安全的。不,沒有問題。人們通常會問是否線程安全,而不是線程不安全。

3

只要它是一個簡單的變量,就沒有風險。

如果它是一個屬性,閱讀它可能會有副作用,所以不能保證是線程安全的。

7

沒有這種操作本質上不是線程安全的。

儘管變量當前未被寫入,但以前對該變量的寫入操作可能對所有線程都不可見。這意味着兩個線程可以讀取相同的值並獲得不同的結果,從而創建競爭條件。

這可以通過內存障礙,正確使用volatile或其他一些機制來防止。我們需要更多地瞭解您的環境,特別是語言,以給出完整的解釋。

稍微重申一下你的問題,雖然會產生更好的答案。假設沒有更多寫入,並且所有先前的寫入對當前線程都是可見的,那麼從多個線程讀取值是安全的。

+0

雖然揮發性的使用確實取決於語言,但答案很好。在c/C++中,volatile是一個明確的錯誤的朋友,因爲生成的代碼非常適合編譯器,並且它們沒有標準來說明一個volatile變量實際上應該做什麼 – zebrabox 2010-06-13 23:11:38

+0

@zebrabox,非常正確。我試圖小心答案,因爲它非常具有語言+平臺特定性。 – JaredPar 2010-06-14 01:09:14