現代のすべての OS は、現在、いくつかのアトミック操作を提供しています。
- Windowsには
Interlocked*
APIがあります - FreeBSD には
<machine/atomic.h>
- ソラリスは
<atomic.h>
- Mac OS X には
<libkern/OSAtomic.h>
Linuxの場合、そのようなものはありますか?
- x86、x86_64、 armなど、ほとんどの Linux 対応プラットフォームで動作する必要があります 。
- 少なくとも GCC と Intel Compiler で動作する必要があります。
- glib や qt のような 3rd par ライブラリを使用する必要はありません。
- C++ で動作させる必要があります (C は必要ありません)
問題:
- GCC アトミック ビルトイン
__sync_*
は、すべてのプラットフォーム (ARM) でサポートされているわけではなく、Intel コンパイラでもサポートされていません。 - 私の知る限り
<asm/atomic.h>
、ユーザー空間では使用しないでください。私はまったく使用していません。また、Intel コンパイラで動作するかどうかもわかりません。
助言がありますか?
関連する質問がたくさんあることは知っていますが、そのうちのいくつかは__sync*
私 (ARM) には実現不可能であると指摘し、いくつかは を指摘していasm/atomic.h
ます。
GCC用にこれを行うインラインアセンブリライブラリがあるかもしれません(ICCはgccアセンブリをサポートしています)?
編集:
追加操作のみの非常に部分的な解決策があります (アトミック カウンターの実装は許可しますが、CAS を必要とする自由構造のロックは許可しません)。
を使用する場合libstc++
(インテル コンパイラは を使用libstdc++
) 、または__gnu_cxx::__exchange_and_add
で定義されたものを使用できます。コンパイラのバージョンに依存します。<ext/atomicity.h>
<bits/atomicity.h>
ただし、CAS をサポートするものを見たいと思っています。