2017-07-19 1116 views
0

比方說我們有一個結構如下─std :: atomic <struct>是否使所有成員都成爲原子?

struct test 
{ 
    int a; 
    int b; 
}; 

我使這個結構的原子變量,並嘗試更新a和b。這些行動是否是原子的?構建一個結構/類是什麼意思?

std::atomic<test> t; 
t.a = 10; // is this an atomic operation? 
t.b = 20; // is this an atomic operation? 
// I understand a and b are not atomic in themselves but I am confused  
// as to when you say struct temp is atomic what does it mean? 
// does it mean the t instance's this pointer is atomic? 
+0

[如何對非基元類型有效地使用std :: atomic <>有可能重複?](https://stackoverflow.com/questions/13885617/how-to-use-stdatomic-effectively-for-non -primitive-types) –

+0

簡短回答:不,正如文檔解釋的那樣,它會獲取並設置整個結構體原子的副本,但不直接訪問其成員。 –

+0

毫無意義,因爲't.a'無效。 'a'是'test'的成員,而不是'atomic ' – LWimsey

回答

1

您正在將一個POD包裝在atomic類型中。在原子對象t上,只能執行原子操作,如load()store()compare_exchange_weak()。 這些操作適用於整個POD(不是它的一部分)並且是不可分割的;即它們不間斷地發生,或者根本不發生。

如果你想改變原子成員a,這是唯一可能在更新整個t對象,但因爲你不想修改會員b, 你需要一個CAS(比較並交換)操作:

std::atomic<test> t; 

test expected = t.load(); 
test desired; 

do { 
    desired = expected; 
    desired.a = 10; 

} while(!t.compare_exchange_weak(expected, desired)); 

如果t被執行的另一個線程load()compare_exchange_weak()之間修改,後者將與t新的值更新expected(左值),並返回0 您然後重新設定desired基於更新的expected並再試一次。

使用普通的store()而不是CAS,可以覆蓋另一個線程所做的更新(即丟失)。

相關問題