Spec-Zone.ru › D

core.atomic

Модуль atomic предоставляет базовую поддержку для конкурентного программирования без блокировок.

Лицензия:
Лицензия Boost 1.0
Авторы:
Шон Келлли, Алекс Рённе Петерсен, Ману Эванс
Источник
core/atomic.d
enum MemoryOrder: int;

Определяет семантику порядка памяти для атомарной операции.

См. также:
en.cppreference.com/w/cpp/atomic/memory_order
raw

Не упорядочено. Соответствует LLVM AtomicOrdering.Monotonic и C++11/C11 memory_order_relaxed.

acq

Барьер hoist-load + hoist-store. Соответствует LLVM AtomicOrdering.Acquire и C++11/C11 memory_order_acquire.

rel

Барьер sink-load + sink-store. Соответствует LLVM AtomicOrdering.Release и C++11/C11 memory_order_release.

acq_rel

Барьер Acquire + release. Соответствует LLVM AtomicOrdering.AcquireRelease и C++11/C11 memory_order_acq_rel.

seq

Полностью упорядочено (acquire + release). Соответствует LLVM AtomicOrdering.SequentiallyConsistent и C++11/C11 memory_order_seq_cst.

pure nothrow @nogc @trusted T atomicLoad(MemoryOrder ms = MemoryOrder.seq, T)(ref const T val)
Constraints: if (!is(T == shared(U), U) && !is(T == shared(inout(U)), U) && !is(T == shared(const(U)), U));

pure nothrow @nogc @trusted T atomicLoad(MemoryOrder ms = MemoryOrder.seq, T)(ref const shared T val)
Constraints: if (!hasUnsharedIndirections!T);

pure nothrow @nogc @trusted TailShared!T atomicLoad(MemoryOrder ms = MemoryOrder.seq, T)(ref const shared T val)
Constraints: if (hasUnsharedIndirections!T);

Загружает 'val' из памяти и возвращает его. Применяется указанный барьер памяти 'ms' к операции, которая по умолчанию полностью упорядочена. Допустимые порядки памяти: MemoryOrder.raw, MemoryOrder.acq и MemoryOrder.seq.

Параметры:
T val Целевая переменная.
Возвращает:
Значение 'val'.
pure nothrow @nogc @trusted void atomicStore(MemoryOrder ms = MemoryOrder.seq, T, V)(ref T val, V newval)
Constraints: if (!is(T == shared) && !is(V == shared));

pure nothrow @nogc @trusted void atomicStore(MemoryOrder ms = MemoryOrder.seq, T, V)(ref shared T val, V newval)
Constraints: if (!is(T == class));

pure nothrow @nogc @trusted void atomicStore(MemoryOrder ms = MemoryOrder.seq, T, V)(ref shared T val, shared V newval)
Constraints: if (is(T == class));

Записывает 'newval' в 'val'. Применяется указанный барьер памяти 'ms' к операции, которая по умолчанию полностью упорядочена. Допустимые порядки памяти: MemoryOrder.raw, MemoryOrder.rel и MemoryOrder.seq.

Параметры:
T val Целевая переменная.
V newval Значение для записи.
pure nothrow @nogc @trusted T atomicFetchAdd(MemoryOrder ms = MemoryOrder.seq, T)(ref T val, size_t mod)
Constraints: if ((__traits(isIntegral, T) || is(T == U*, U)) && !is(T == shared));

pure nothrow @nogc @trusted T atomicFetchAdd(MemoryOrder ms = MemoryOrder.seq, T)(ref shared T val, size_t mod)
Constraints: if (__traits(isIntegral, T) || is(T == U*, U));

Атомарно добавляет mod к значению, на которое ссылается val, и возвращает значение val, которое было ранее. Эта операция является и бесключевой, и атомарной.

Параметры:
T val Ссылка на изменяемое значение.
size_t mod Значение для добавления.
Возвращает:
Значение, которое ранее хранилось в val.
pure nothrow @nogc @trusted T atomicFetchSub(MemoryOrder ms = MemoryOrder.seq, T)(ref T val, size_t mod)
Constraints: if ((__traits(isIntegral, T) || is(T == U*, U)) && !is(T == shared));

pure nothrow @nogc @trusted T atomicFetchSub(MemoryOrder ms = MemoryOrder.seq, T)(ref shared T val, size_t mod)
Constraints: if (__traits(isIntegral, T) || is(T == U*, U));

Атомарно вычитает mod из значения, на которое ссылается val, и возвращает значение val, которое было ранее. Эта операция является и бесключевой, и атомарной.

Параметры:
T val Ссылка на изменяемое значение.
size_t mod Значение для вычитания.
Возвращает:
Значение, которое ранее хранилось в val.
pure nothrow @nogc @trusted T atomicExchange(MemoryOrder ms = MemoryOrder.seq, T, V)(T* here, V exchangeWith)
Constraints: if (!is(T == shared) && !is(V == shared));

pure nothrow @nogc @trusted TailShared!T atomicExchange(MemoryOrder ms = MemoryOrder.seq, T, V)(shared(T)* here, V exchangeWith)
Constraints: if (!is(T == class) && !is(T == interface));

pure nothrow @nogc @trusted shared(T) atomicExchange(MemoryOrder ms = MemoryOrder.seq, T, V)(shared(T)* here, shared(V) exchangeWith)
Constraints: if (is(T == class) || is(T == interface));

Обмен exchangeWith со значением памяти, на которую ссылается here. Эта операция является и бесключевой, и атомарной.

Параметры:
T* here Адрес целевой переменной.
V exchangeWith Значение для обмена.
Возвращает:
Значение, которое ранее хранилось в here.
template cas(MemoryOrder succ = MemoryOrder.seq, MemoryOrder fail = MemoryOrder.seq)

Выполняет сравнение и установку или сравнение и обмен (или обмен).

Существует две категории перегрузок в этом шаблоне: первая категория выполняет простое сравнение и установку. Значение сравнения (ifThis) обрабатывается как rvalue.

Вторая категория выполняет сравнение и обмен (также известное как сравнение и обмен), и ожидает, что ifThis будет типом указателя, где предыдущее значение here будет записано.

Эта операция является и бесключевой, и атомарной.

Параметры:
T* here Адрес целевой переменной.
V2 writeThis Значение для записи.
V1 ifThis Значение для сравнения.
Возвращает:
true, если запись произошла, false — если нет.
pure nothrow @nogc @trusted bool cas(T, V1, V2)(T* here, V1 ifThis, V2 writeThis)
Constraints: if (!is(T == shared) && is(T : V1));

Сравнение и установка для значений, не являющихся общими.

pure nothrow @nogc @trusted bool cas(T, V1, V2)(shared(T)* here, V1 ifThis, V2 writeThis)
Constraints: if (!is(T == class) && (is(T : V1) || is(shared(T) : V1)));

Сравнение и установка для общего типа значения.

pure nothrow @nogc @trusted bool cas(T, V1, V2)(shared(T)* here, shared(V1) ifThis, shared(V2) writeThis)
Constraints: if (is(T == class));

Сравнение и установка для типа ссылки shared (class)

pure nothrow @nogc @trusted bool cas(T, V)(T* here, T* ifThis, V writeThis)
Constraints: if (!is(T == shared) && !is(V == shared));

Сравнение и обмен для типов, не являющихся общими.

pure nothrow @nogc @trusted bool cas(T, V1, V2)(shared(T)* here, V1* ifThis, V2 writeThis)
Constraints: if (!is(T == class) && (is(T : V1) || is(shared(T) : V1)));

Сравнение и обмен для смешанных типов.

pure nothrow @nogc @trusted bool cas(T, V)(shared(T)* here, shared(T)* ifThis, shared(V) writeThis)
Constraints: if (is(T == class));

Сравнение и обмен для class

pure nothrow @nogc @trusted bool casWeak(MemoryOrder succ = MemoryOrder.seq, MemoryOrder fail = MemoryOrder.seq, T, V1, V2)(T* here, V1 ifThis, V2 writeThis)
Constraints: if (!is(T == shared) && is(T : V1));

pure nothrow @nogc @trusted bool casWeak(MemoryOrder succ = MemoryOrder.seq, MemoryOrder fail = MemoryOrder.seq, T, V1, V2)(shared(T)* here, V1 ifThis, V2 writeThis)
Constraints: if (!is(T == class) && (is(T : V1) || is(shared(T) : V1)));

pure nothrow @nogc @trusted bool casWeak(MemoryOrder succ = MemoryOrder.seq, MemoryOrder fail = MemoryOrder.seq, T, V1, V2)(shared(T)* here, shared(V1) ifThis, shared(V2) writeThis)
Constraints: if (is(T == class));

Хранит 'writeThis' в памяти, на которую ссылается 'here', если значение, на которое ссылается 'here', равно 'ifThis'. Слабая версия cas может ошибочно завершиться. Рекомендуется использовать casWeak только тогда, когда cas используется в цикле. Данная операция является как потокобезопасной, так и атомарной.

Параметры:
T* here Адрес целевой переменной.
V2 writeThis Значение для записи.
V1 ifThis Значение для сравнения.
Возвращает:
true, если запись произошла, false — если нет.
pure nothrow @nogc @trusted bool casWeak(MemoryOrder succ = MemoryOrder.seq, MemoryOrder fail = MemoryOrder.seq, T, V)(T* here, T* ifThis, V writeThis)
Constraints: if (!is(T == shared(S), S) && !is(V == shared(U), U));

pure nothrow @nogc @trusted bool casWeak(MemoryOrder succ = MemoryOrder.seq, MemoryOrder fail = MemoryOrder.seq, T, V1, V2)(shared(T)* here, V1* ifThis, V2 writeThis)
Constraints: if (!is(T == class) && (is(T : V1) || is(shared(T) : V1)));

pure nothrow @nogc @trusted bool casWeak(MemoryOrder succ = MemoryOrder.seq, MemoryOrder fail = MemoryOrder.seq, T, V)(shared(T)* here, shared(T)* ifThis, shared(V) writeThis)
Constraints: if (is(T == class));

Хранит 'writeThis' в памяти, на которую ссылается 'here', если значение, на которое ссылается 'here', равно значению, на которое ссылается 'ifThis'. Предыдущее значение, на которое ссылался 'here', записывается в ifThis и возвращается пользователю. Слабая версия cas может ошибочно завершиться. Рекомендуется использовать casWeak только тогда, когда cas используется в цикле. Данная операция является как потокобезопасной, так и атомарной.

Параметры:
T* here Адрес целевой переменной.
V writeThis Значение для записи.
T* ifThis Адрес значения для сравнения, и он получает предыдущее значение here в качестве результата.
Возвращает:
true, если запись произошла, false — если нет.
pure nothrow @nogc @safe void atomicFence(MemoryOrder order = MemoryOrder.seq)();

Вставляет полную барьерную память загрузки/записи (на платформах, где это необходимо). Это гарантирует, что все загрузки и записи перед вызовом этой функции выполняются до любых загрузок и записей после вызова.

pure nothrow @nogc @safe void pause();

Даёт подсказку процессору о том, что вызывающая нить находится в цикле «ожидание-вращение», что позволяет более эффективно выделять ресурсы.

pure nothrow @nogc @safe TailShared!T atomicOp(string op, T, V1)(ref shared T val, V1 mod)
Constraints: if (__traits(compiles, mixin("*cast(T*)&val" ~ op ~ "mod")));

Выполняет бинарную операцию 'op' над val, используя 'mod' в качестве модификатора.

Параметры:
T val Целевая переменная.
V1 mod Модификатор для применения.
Возвращает:
Результат операции.

© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/core_atomic.html

Spec-Zone.ru

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