7.13.39 Встроенные функции транзакционной памяти x86
Эти встроенные функции аппаратной транзакционной памяти для x86 позволяют использовать транзакции памяти с RTM (Restricted Transactional Memory — ограниченная транзакционная память). Эта поддержка включается параметром -mrtm. О применении HLE (Hardware Lock Elision — аппаратного исключения блокировок) см. специальные для x86 расширения модели памяти для транзакционной памяти.
Транзакция памяти атомарно фиксирует все изменения памяти, делая их видимыми для других потоков. Если транзакция завершается неудачно, она откатывается, а все побочные эффекты отбрасываются.
Как правило, нет гарантии, что транзакция памяти когда-либо завершится успешно, поэтому всегда необходимо предоставлять подходящий резервный код.
-
Функция RTM:
unsigned_xbegin() -
Начинает транзакцию RTM (Restricted Transactional Memory — ограниченная транзакционная память). Возвращает
_XBEGIN_STARTED, если транзакция успешно началась (обратите внимание: это не 0, поэтому константу необходимо проверять явно).Если транзакция прерывается, все побочные эффекты отменяются, а возвращается код прерывания, закодированный в виде битовой маски. Определены следующие макросы:
- Макрос: _XABORT_EXPLICIT
Транзакция была явно прервана с помощью
_xabort. Параметр, переданный в_xabort, доступен через_XABORT_CODE(status).
- Макрос: _XABORT_RETRY
Повторная попытка выполнить транзакцию возможна.
- Макрос: _XABORT_CONFLICT
Транзакция прервана из-за конфликта памяти с другим потоком.
- Макрос: _XABORT_CAPACITY
Транзакция прервана, поскольку использует слишком много памяти.
- Макрос: _XABORT_DEBUG
Транзакция прервана из-за отладочного исключения.
- Макрос: _XABORT_NESTED
Транзакция прервана во внутренней вложенной транзакции.
Нет гарантии, что какая-либо транзакция когда-либо завершится успешно, поэтому всегда должен быть предусмотрен допустимый резервный путь.
-
Функция RTM:
void_xend() Фиксирует текущую транзакцию. Если активной транзакции нет, возникает ошибка. Все побочные эффекты транзакции в памяти становятся видимыми для других потоков атомарным образом.
-
Функция RTM:
int_xtest() Возвращает ненулевое значение, если транзакция в данный момент активна, и 0 в противном случае.
-
Функция RTM:
void_xabort(status) Прерывает текущую транзакцию. Если активной транзакции нет, ничего не происходит. Значение status — это 8-битная константа; оно закодировано в возвращаемом значении
_xbegin.
Ниже приведён пример обработки _XABORT_RETRY и резервного пути для других сбоев:
#include <immintrin.h>
int n_tries, max_tries;
unsigned status = _XABORT_EXPLICIT;
...
for (n_tries = 0; n_tries < max_tries; n_tries++)
{
status = _xbegin ();
if (status == _XBEGIN_STARTED || !(status & _XABORT_RETRY))
break;
}
if (status == _XBEGIN_STARTED)
{
... transaction code...
_xend ();
}
else
{
... non-transactional fallback path...
}
Обратите внимание: в большинстве случаев транзакционный и нетранзакционный код должны синхронизироваться друг с другом, чтобы обеспечить согласованность.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/x86-transactional-memory-intrinsics.html