2016-10-03 48 views
0

希望這個問題很容易理解。在任何情況下,讓我們寫一些代碼...多線程:寫入後從另一個線程首次訪問...我需要volatile嗎?

struct MyClass 
{ 
    int a; 
    std::vector<char> b; 
    ... 
} 

MyClass object; 

比方說,我正在運行兩個線程A和B:

  1. 線程A創建對象並讀取或除A和B中寫入一些數據成員。
  2. 線程A將指向對象的指針傳遞給將在線程B中運行的函數。
  3. 線程B向向量b寫入或添加數據。
  4. 線程A讀取a和b(即,首次訪問它們)。

如果答案是肯定的,即我在這種情況下需要震盪,我還有一個問題:爲什麼它是線程安全的使用,其中的數據成員都寫在一個線程,並閱讀其他許多不可改變的對象?看起來與這種情況非常相似:)

+1

如果正在寫入數據成員,則該對象不是不可變的。 – Galik

+4

volatile還不夠,你需要像互斥體那樣正確的同步。 – Galik

+3

線程和volatile沒有任何關係,不管怎樣 –

回答

1

爲什麼線程安全的使用不可變對象,其中數據成員被寫入一個線程並在其他許多線程中讀取?

不可變對象創建,然後在該點之後不會改變。由於對象的多線程訪問只有在創建後纔有可能(之前有什麼共享),每個線程將始終看到相同的值。

因此永遠不會出現不可變對象在單獨線程上以不同方式出現的情況,因爲不可變對象在共享之後無法更改狀態。