Каждая современная ОС предоставляет сегодня некоторые атомные операции:
- Windows имеет
Interlocked*
API - FreeBSD имеет
<machine/atomic.h>
- Solaris имеет
<atomic.h>
- Mac OS X имеет
<libkern/OSAtomic.h>
Что-нибудь подобное для Linux?
- Мне нужно, чтобы он работал на большинстве поддерживаемых Linux платформ, включая: x86, x86_64 и arm.
- Мне нужно, чтобы он работал, по крайней мере, с GCC и компилятором Intel.
- Мне не нужно использовать третью парную библиотеку, такую как glib или qt.
- Мне нужно, чтобы он работал на С++ (C не требуется)
Вопросы:
- GCC atomic builtins
__sync_*
не поддерживаются на всех платформах (ARM) и не поддерживаются компилятором Intel. - AFAIK
<asm/atomic.h>
не должен использоваться в пользовательском пространстве, и я не использовал его вообще. Кроме того, я не уверен, будет ли он работать с компилятором Intel.
Любые предложения?
Я знаю, что есть много связанных вопросов, но некоторые из них указывают на __sync*
, что для меня невозможно (ARM), а некоторые указывают на asm/atomic.h
.
Может быть, есть встроенная сборная библиотека, которая делает это для GCC (ICC поддерживает сборку gcc)?
Изменить:
Существует только частичное решение только для операций добавления (позволяет реализовать атомный счетчик, но не блокировать свободные структуры, требующие CAS):
Если вы используете libstc++
(Intel Compiler использует libstdc++
), вы можете использовать __gnu_cxx::__exchange_and_add
, который определен в <ext/atomicity.h>
или <bits/atomicity.h>
. Зависит от версии компилятора.
Однако мне все же хотелось бы увидеть что-то, что поддерживает CAS.