カーネル側でメモリ バリアを設定するのは簡単です。マクロ mb、wmb、rmb などは、Linux カーネル ヘッダーのおかげで常に配置されています。
ユーザー側でこれを達成する方法は?
カーネル側でメモリ バリアを設定するのは簡単です。マクロ mb、wmb、rmb などは、Linux カーネル ヘッダーのおかげで常に配置されています。
ユーザー側でこれを達成する方法は?
gccの完全なメモリ バリアアトミック ビルトインを探しています。
私がここで与えた参照の詳細に注意してください、
[次の] ビルトインは、インテル Itanium プロセッサ固有のアプリケーション バイナリ インターフェイスのセクション 7.4 で説明されているものと互換性があるように意図されています。そのため、「__builtin_」プレフィックスを使用するという通常の GCC の慣行から逸脱し、さらに複数の型で動作するようにオーバーロードされています。
Posixでは、多くの関数がメモリ バリアとして機能するものとして定義されています。メモリー位置は同時にアクセスしてはなりません。これを防ぐには、同期を使用します。同期はバリアとしても機能します。
libatomic_ops を使用します。 http://www.hpl.hp.com/research/linux/atomic_ops/
これはコンパイラ固有のものではなく、GCC のものよりもバグが少ないです。気にしない機能を大量に提供する巨大なライブラリではありません。アトミック操作を提供するだけです。また、さまざまな CPU アーキテクチャに移植できます。
Linux x64 は、Intel メモリ バリア命令を使用できることを意味します。これらのマクロが適切でないか、コードにアクセスできない場合は、Linux ヘッダーと同様のマクロでそれらをラップすることができます。
Qprof プロファイリング ライブラリ (Qt とは関係ありません) のソース コードには、メモリ バリアを含むアトミック操作のライブラリも含まれています。それらは多くのコンパイラとアーキテクチャで動作します。私は自分のプロジェクトでそれを使用しています。
__sync_synchronize()
GCC 4.4 以降で
Intel Memory Ordering White Paper、Intel 64 および IA-32 マニュアルの Volume 3A のセクションhttp://developer.intel.com/Assets/PDF/manual/253668.pdf
最近の Qt ディストリビューションのinclude/arch/qatomic_*.h
ヘッダーには、多くのアーキテクチャとあらゆる種類のメモリ バリア (取得、解放、両方) 用の (LGPL) コードが含まれています。
Linux カーネル用に定義されたバリアを借りて、それらのマクロをヘッダー ファイルに追加するだけです: http://lxr.linux.no/#linux+v3.6.5/arch/x86/include/asm/barrier.h#L21。そしてもちろん、ソース コードで Linux 開発者の功績を認めてください。