Spec-Zone.ru › Nim

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API