до C11
В библиотеке C их нет.
В Linux gcc предоставляет некоторые - ищите __sync_fetch_and_add
, __sync_fetch_and_sub
и так далее.
В случае Windows ищите InterlockedIncrement
, InterlockedDecrement``,
InterlockedExchange` и т. Д. Если вы используете gcc в Windows, я предполагаю, что он также имеет те же встроенные функции, что и в Linux (хотя я этого не проверял).
На Солярисе это будет зависеть. Предположительно, если вы используете gcc, он, вероятно, (опять же) будет иметь те же встроенные функции, что и в Linux. В противном случае есть плавающие библиотеки, но на самом деле ничего не стандартизировано.
C11
C11 добавил (разумно) полный набор атомарных операций и атомарных типов. Операции включают в себя такие вещи, как atomic_fetch_add
и atomic_fetch_sum
(и *_explicit
версии того же самого, которые позволяют вам указать необходимую модель заказа, где стандартные по умолчанию всегда используют memory_order_seq_cst
). Есть также fence
функции, такие как atomic_thread_fence
и atomic_signal_fence
.
Типы соответствуют каждому из нормальных целочисленных типов - например, atomic_int8_t
соответствует int8_t
и atomic_uint_least64_t
соответствует uint_least64_t
. Это typedef
имена, определенные в <stdatomic.h>
. Чтобы избежать конфликтов с любыми существующими именами, вы можете опустить заголовок; сам компилятор использует имена в пространстве имен разработчика (например, _Atomic_uint_least32_t
вместо atomic_uint_least32_t
).