2017-02-27 3 views
1

C++のメモリ障壁の仕組みを理解したいと思います。例えば 、私はそのような場合にはstd ::アトミック使用しています:std :: atomic memory barrierの理解

#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

2つのexemples 'int n = a.load(std :: memory_order_acquire)'と2番目の例では、4行目の 'a = 100'ですか? – Oliv

+0

いいえ、ロード関数はstd :: atomic load関数ではありません。これは、いくつかのデータを返すユーザ実装の関数 –

+0

この例は混乱しているようです。最初の抜粋は明らかに値を 'a'に格納します。しかし、2番目の抜粋は '' 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; 
} 

(値は、あなたがそこまでやったこととは異なりますが)。そこにがフェンス内の原子ストアでなければなりません。 hereの "fence-fence synchronization"または "fence-atomic synchronization"の条件を確認してください。 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)を呼んでいる時を知りたい。ストア機能内のすべての操作を呼び出す前に、平均的なバリアが置かれているということですか? –

関連する問題