2017-02-27 103 views
1

我想了解如何在C++中工作內存障礙。 例如,我使用的std ::原子在這種情況下:瞭解std ::原子內存障礙

#include <iostream> 
#include <atomic> 

int main() 
{ 
    std::atomic<int> a; 
    int n = load();//returns 1 or other value written by other thread 
    a.store (n, std::memory_order_release); 
} 

是上述語義的代碼等於下面的代碼?

#include <iostream> 
#include <atomic> 
int main() 
{ 
    std::atomic<int> a; 
    int n = load(); 
    std::atomic_thread_fence(std::memory_order_release); 
    n = 100;//assume assignment is atomic 
} 

如果我是正確的,我可以肯定的是行爲是相等的,可以接受記憶障礙,參數中的所有C++函數?

+0

你的意思是在主函數的第二行,在兩個例子'int n = a.load(std :: memory_order_acquire)'和第二個例子中,第四行:'a = 100'? – Oliv

+0

不,加載函數不是std :: atomic加載函數。這是一個用戶實現的函數,它返回一些數據 –

+0

這個例子看起來很混亂。第一部分清楚地將一個值存儲到'a'中。但是第二部分片段根本沒有提及'a',爲什麼它在那裏? –

回答

0

沒有,但它是相同的:

#include <iostream> 
#include <atomic> 
int main() 
{ 
    std::atomic<int> a; 
    int n = load(); 
    std::atomic_thread_fence(std::memory_order_release); 
    a.store (12345, std::memory_order_relaxed); 
    n=100; 
} 

(雖然數值比你做了一下有不同)。有必須是圍牆內的原子商店。檢查「fence-fence synchronization」或「fence-atomic synchronization」下的條件here。雖然您在存儲a時沒有設置任何約束,但它將在memory_order_release之內,n也是如此。這就是圍牆所做的。

+0

據我瞭解,你把這個代碼a.store(12345,std :: memory_order_relaxed);提供原子分配。我只是想知道執行順序。在我的代碼中,屏障會影響到這個地方嗎? –

+0

@DarkRider'memory_order_release'障礙*必須放在你想要的所有東西之前。另一方面,'memory_order_acquire'的障礙必須在你想要同步的所有東西之後。這就是爲什麼它被稱爲「圍欄」。這就像你把同步的東西放在一個以* release *開始並以* acquire *結尾的籠子裏。這是否回答你的問題? –

+0

我只想知道什麼時候我打電話給a.store(n,std :: memory_order_release);是否在調用存儲函數內的所有操作之前放置了平均屏障?我無法找到合適的源代碼來看 –