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