std/sysatomics
Исходный кодРедактироватьВыполнить операцию и вернуть новое значение, все модели памяти допустимыВыполнить операцию и вернуть старое значение, все модели памяти допустимы
Типы
AtomMemModel = distinct cint
- Исходный код Редактировать
AtomType = SomeNumber | pointer | ptr | char | bool
- Класс типа, представляющий допустимые типы для использования с атомными процедурами Исходный код Редактировать
Переменные
ATOMIC_ACQ_REL {.importc: "__ATOMIC_ACQ_REL", nodecl.}: AtomMemModel- Полный барьер в обоих направлениях и синхронизируется со скачками приобретения и сохранения освобождения в другом потоке. Исходный код Редактировать
ATOMIC_ACQUIRE {.importc: "__ATOMIC_ACQUIRE", nodecl.}: AtomMemModel- Барьер для подъема кода и синхронизируется с сохранением с семантикой освобождения (или более сильной) из другого потока. Исходный код Редактировать
ATOMIC_CONSUME {.importc: "__ATOMIC_CONSUME", nodecl.}: AtomMemModel- Только зависимость данных для обоих барьеров и синхронизации с другим потоком. Исходный код Редактировать
ATOMIC_RELAXED {.importc: "__ATOMIC_RELAXED", nodecl.}: AtomMemModel- Без барьеров или синхронизации. Исходный код Редактировать
ATOMIC_RELEASE {.importc: "__ATOMIC_RELEASE", nodecl.}: AtomMemModel- Барьер для погружения кода и синхронизируется с загрузками с семантикой приобретения (или более сильной) из другого потока. Исходный код Редактировать
ATOMIC_SEQ_CST {.importc: "__ATOMIC_SEQ_CST", nodecl.}: AtomMemModel- Полный барьер в обоих направлениях и синхронизируется со скачками приобретения и сохранения освобождения во всех потоках. Исходный код Редактировать
Процедуры
proc atomicAddFetch[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_add_fetch", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc atomicAlwaysLockFree(size: int; p: pointer): bool {. importc: "__atomic_always_lock_free", nodecl, ...raises: [], tags: [], forbids: [].}- Эта встроенная функция возвращает true, если объекты размером bytes всегда генерируют безблокировочные атомарные инструкции для целевой архитектуры. size должен разрешаться в константу времени компиляции, и результат также разрешается в константу времени компиляции. ptr — это необязательный указатель на объект, который может использоваться для определения выравнивания. Значение 0 указывает на то, что следует использовать типичное выравнивание. Компилятор также может игнорировать этот параметр. Исходный код Редактировать
proc atomicAndFetch[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_and_fetch", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc atomicClear(p: pointer; mem: AtomMemModel) {.importc: "__atomic_clear", nodecl, ...raises: [], tags: [], forbids: [].}- Эта встроенная функция выполняет атомарную операцию очистки в p. После операции в p содержится 0. ATOMIC_RELAXED, ATOMIC_SEQ_CST, ATOMIC_RELEASE Исходный код Редактировать
proc atomicCompareExchange[T: AtomType](p, expected, desired: ptr T; weak: bool; success_memmodel: AtomMemModel; failure_memmodel: AtomMemModel): bool {. importc: "__atomic_compare_exchange", nodecl, ...raises: [], tags: [], forbids: [].}- Эта процедура реализует универсальную версию atomic_compare_exchange. Процедура практически идентична atomic_compare_exchange_n, за исключением того, что желаемое значение также является указателем. Исходный код Редактировать
proc atomicCompareExchangeN[T: AtomType](p, expected: ptr T; desired: T; weak: bool; success_memmodel: AtomMemModel; failure_memmodel: AtomMemModel): bool {. importc: "__atomic_compare_exchange_n", nodecl, ...raises: [], tags: [], forbids: [].}- Эта процедура реализует атомарную операцию сравнения и обмена. Она сравнивает содержимое в p с содержимым в expected и, если они равны, записывает desired в p. Если они не равны, текущее содержимое в p записывается в expected. Weak равно true для слабого compare_exchange и false для сильной вариации. Многие платформы предлагают только сильную вариацию и игнорируют параметр. В случае сомнений используйте сильную вариацию. True возвращается, если desired записан в p, и выполнение считается соответствующим модели памяти, указанной в success_memmodel. Здесь нет ограничений на то, какая модель памяти может использоваться. False возвращается в противном случае, и выполнение считается соответствующим failure_memmodel. Эта модель памяти не может быть __ATOMIC_RELEASE или __ATOMIC_ACQ_REL. Она также не может быть более сильной моделью, чем указанная в success_memmodel. Исходный код Редактировать
proc atomicDec(memLoc: var int; x: int = 1): int {.inline, discardable, ...raises: [], tags: [], forbids: [].}- Атомарно уменьшает целое число на некоторое
x. Возвращает новое значение. Исходный код Редактировать proc atomicExchange[T: AtomType](p, val, ret: ptr T; mem: AtomMemModel) {. importc: "__atomic_exchange", nodecl, ...raises: [], tags: [], forbids: [].}- Это универсальная версия атомарного обмена. Она сохраняет содержимое val в p. Оригинальное значение в p копируется в ret. Исходный код Редактировать
proc atomicExchangeN[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_exchange_n", nodecl, ...raises: [], tags: [], forbids: [].}- Эта процедура реализует атомарную операцию обмена. Она записывает val в p и возвращает предыдущее содержимое в p. ATOMIC_RELAXED, ATOMIC_SEQ_CST, ATOMIC_ACQUIRE, ATOMIC_RELEASE, ATOMIC_ACQ_REL Исходный код Редактировать
proc atomicFetchAdd[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_fetch_add", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc atomicFetchAnd[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_fetch_and", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc atomicFetchNand[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_fetch_nand", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc atomicFetchOr[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_fetch_or", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc atomicFetchSub[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_fetch_sub", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc atomicFetchXor[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_fetch_xor", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc atomicInc(memLoc: var int; x: int = 1): int {.inline, discardable, ...raises: [], tags: [], forbids: [].}- Атомарно увеличивает целое число на некоторое
x. Возвращает новое значение. Исходный код Редактировать proc atomicIsLockFree(size: int; p: pointer): bool {. importc: "__atomic_is_lock_free", nodecl, ...raises: [], tags: [], forbids: [].}- Эта встроенная функция возвращает true, если объекты размером bytes всегда генерируют безблокировочные атомарные инструкции для целевой архитектуры. Если неизвестно, является ли она безблокировочной, вызов осуществляется в подпрограмму времени выполнения с именем __atomic_is_lock_free. ptr — это необязательный указатель на объект, который может использоваться для определения выравнивания. Значение 0 указывает на то, что следует использовать типичное выравнивание. Компилятор также может игнорировать этот параметр. Исходный код Редактировать
proc atomicLoad[T: AtomType](p, ret: ptr T; mem: AtomMemModel) {. importc: "__atomic_load", nodecl, ...raises: [], tags: [], forbids: [].}- Это универсальная версия атомарной загрузки. Она возвращает содержимое в p в ret. Исходный код Редактировать
proc atomicLoadN[T: AtomType](p: ptr T; mem: AtomMemModel): T {. importc: "__atomic_load_n", nodecl, ...raises: [], tags: [], forbids: [].}- Эта процедура реализует атомарную операцию загрузки. Она возвращает содержимое в p. ATOMIC_RELAXED, ATOMIC_SEQ_CST, ATOMIC_ACQUIRE, ATOMIC_CONSUME. Исходный код Редактировать
proc atomicNandFetch[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_nand_fetch", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc atomicOrFetch[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_or_fetch", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc atomicSignalFence(mem: AtomMemModel) {.importc: "__atomic_signal_fence", nodecl, ...raises: [], tags: [], forbids: [].}- Эта встроенная функция действует как забор синхронизации между потоком и обработчиками сигналов, основанными на том же потоке. Все порядки памяти допустимы. Исходный код Редактировать
proc atomicStore[T: AtomType](p, val: ptr T; mem: AtomMemModel) {. importc: "__atomic_store", nodecl, ...raises: [], tags: [], forbids: [].}- Это универсальная версия атомарного сохранения. Она сохраняет значение val в p Исходный код Редактировать
proc atomicStoreN[T: AtomType](p: ptr T; val: T; mem: AtomMemModel) {. importc: "__atomic_store_n", nodecl, ...raises: [], tags: [], forbids: [].}- Эта процедура реализует атомарную операцию сохранения. Она записывает val в p. ATOMIC_RELAXED, ATOMIC_SEQ_CST и ATOMIC_RELEASE. Исходный код Редактировать
proc atomicSubFetch[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_sub_fetch", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc atomicTestAndSet(p: pointer; mem: AtomMemModel): bool {. importc: "__atomic_test_and_set", nodecl, ...raises: [], tags: [], forbids: [].}- Эта встроенная функция выполняет атомную операцию «проверка и установка» байта по адресу p. Байт устанавливается в некоторое определенное реализацией ненулевое значение «установка», а значение возврата равно true тогда и только тогда, когда предыдущее содержимое было «установлено». Все модели памяти допустимы. Исходный код Редактировать
proc atomicThreadFence(mem: AtomMemModel) {.importc: "__atomic_thread_fence", nodecl, ...raises: [], tags: [], forbids: [].}- Эта встроенная функция действует как барьер синхронизации между потоками на основе указанной модели памяти. Все порядки памяти допустимы. Исходный код Редактировать
proc atomicXorFetch[T: AtomType](p: ptr T; val: T; mem: AtomMemModel): T {. importc: "__atomic_xor_fetch", nodecl, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc cas[T: bool | int | ptr](p: ptr T; oldValue, newValue: T): bool
- Исходный код Редактировать
proc cpuRelax() {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
Шаблоны
template fence()
- Исходный код Редактировать
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/sysatomics.html