До С11
В библиотеке 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
).
person
Jerry Coffin
schedule
20.02.2010