6.60.34 x86 Интринсики транзакционной памяти
Эти аппаратные интринсики транзакционной памяти для 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...
}
Обратите внимание, что в большинстве случаев транзакционный и не транзакционный код должны синхронизироваться вместе, чтобы обеспечить согласованность.
Далее: x86 интринсики защиты потока управления, Предыдущее: x86 Встроенные функции, Вверх: Встроенные функции целевого объекта [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/x86-transactional-memory-intrinsics.html