6.60.36 x86 Транзакционная память Intrinsics
Эти встроенные функции для транзакционной памяти x86 позволяют вам использовать транзакции памяти с RTM (ограниченной транзакционной памятью). Эта поддержка включена с опцией -mrtm. Для использования HLE (удаление аппаратных блокировок) см. x86-Специфичные расширения модели памяти для транзакционной памяти вместо этого.
Транзакция памяти выполняет все изменения в памяти атомарным образом, как видно другим потокам. Если транзакция завершается неудачно, она отменяется, и все побочные эффекты отбрасываются.
В общем случае нет гарантии, что транзакция памяти всегда будет успешной, и всегда необходимо предоставить подходящий код отката.
-
Функция RTM:
unsigned_xbegin() -
Начать транзакцию RTM (ограниченная транзакционная память). Возвращает
_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-13.3.0/gcc/x86-transactional-memory-intrinsics.html