10

volatile キーワードに関するこの質問への回答を読んでいました。

https://stackoverflow.com/a/2485177/997112

その人はこう言います。

並べ替えを防止する解決策は、メモリ バリアを使用することです。これは、コンパイラと CPU の両方に対して、この時点でメモリ アクセスを並べ替えることができないことを示します。volatile 変数アクセスの周りにこのようなバリアを配置することで、non-volatile アクセスでさえも volatile アクセスを介して並べ替えられないことが保証され、スレッド セーフなコードを記述できるようになります。

ただし、メモリバリアは、バリアに到達したときに保留中のすべての読み取り/書き込みが実行されることも保証するため、必要なものすべてを効果的に提供し、volatile を不要にします。volatile 修飾子を完全に削除するだけです。

この「メモリバリア」はC++でどのように実装されていますか?

編集:

誰かが簡単なコード例を教えてください。

4

3 に答える 3

2

通常、「組み込み関数」があります。これらは、コンパイラがどのように動作するかについて特別な知識を持っている特別な関数です (特に、それらがメモリバリアであること)。名前はコンパイラごとに異なります (同じコンパイラの異なるアーキテクチャの場合もあります)。

たとえば、MSVC では_ReadBarrierWriteBarrierおよび_ReadWriteBarrier

x86 ではlfencesfenceまたはmfence命令が生成されます。これは、それぞれ「ロード」、「ストア」、および「すべてのメモリ操作」バリアを行います。つまり、 はlfenceメモリ読み取り操作のバリアとなり、 ansfenceは「メモリ」となります。 write" バリアでありmfence、読み取り操作と書き込み操作の両方に対するバリアになります。

于 2013-07-27T19:06:44.820 に答える