Every Modern OS provides today some atomic operations:
- Windows has
Interlocked*
API
- FreeBSD has
<machine/atomic.h>
- Solaris has
<atomic.h>
- Mac OS X has
<libkern/OSAtomic.h>
Anything like that for Linux?
- I need it to work on most Linux supported platforms including: x86, x86_64 and arm.
- I need it to work on at least GCC and Intel Compiler.
- I need not to use 3rd par library like glib or qt.
- I need it to work in C++ (C not required)
Issues:
- GCC atomic builtins
__sync_*
are not supported on all platforms (ARM) and are not supported by the Intel compiler.
- AFAIK
<asm/atomic.h>
should not be used in user space and I haven't successfully used it at all. Also, I'm not sure if it would work with Intel compiler.
Any suggestions?
I know that there are many related questions but some of them point to __sync*
which is not feasible for me (ARM) and some point to asm/atomic.h
.
Maybe there is an inline assembly library that does this for GCC (ICC supports gcc assembly)?
Edit:
There is a very partial solution for add operations only (allows implementing atomic counter but not lock free-structures that require CAS):
If you use libstc++
(Intel Compiler uses libstdc++
) then you can use __gnu_cxx::__exchange_and_add
that defined in <ext/atomicity.h>
or <bits/atomicity.h>
. Depends on compiler version.
However I'd still like to see something that supports CAS.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…