2017-08-15 88 views
0

比方說,我們有這樣的一段代碼,這是正確的(我希望至少):組合原子和非原子變量和緩存

std::atomic<int> a; 
std::atomic<bool> ready{false}; 
void threadA() { 
    a.store(666, std::memory_order_relaxed); 
    ready.store(true, std::memory_order_release); 
} 

void threadB() { 
    while(!ready.load(std::memory_order_acquire)); 
    process(a.load(std::memory_order_relaxed)); 
} 

我的問題是:在這種情況下,你使用的是int a;代替std::atomic<int> a;,這是正確的?或者是否存在緩存刷新/失效問題?

+0

如果您必須要求...使用順序一致性。除非經過嚴格的評論和封裝,即使你明白你在做什麼,維護你的代碼的人也不會。 –

+0

這不是真的用於特定的用例。對於理論來說,這比理解更多;)。 但是,此代碼是否可以與順序一致性工作? –

+1

對我來說看起來很好。我會鼓勵你觀看這個叫做「原子武器」的演講。這一切對我來說都是有意義的。 https://www.youtube.com/watch?v=c1gO9aB9nbs –

回答

1

不管這是一個好主意,作爲一個例子,你的代碼是很好..

您可以用常規int(或任何類型爲此事)取代原子類型的a
C++標準支持與下面的語句的情況下(第1.10.1-6):

某些庫的調用由另一個線程執行的其他庫調用同步。例如,原子商店釋放與負載獲取該獲取其值從商店

由於threadB載荷由threadA(它是在一個循環中等待它),則存儲的ready值同步同步 - 與建立關係。 因此,a.load()觀察到a.store()的記憶效應。另一種說法是,a.store()發生在之間a.load()

+0

是的,但我的問題更多的是:是否正確地將原子變量替換爲非原子變量。你在開始時回答;) –