6.60.37 Встроенные функции для транзакционной памяти x86 ¶
Эти встроенные функции для транзакционной памяти аппаратного обеспечения x86 позволяют использовать транзакции памяти с RTM (Ограниченная транзакционная память). Эта поддержка включается с опцией -mrtm. Для использования HLE (Hardware Lock Elision) вместо этого обратитесь к 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-11.4.0/gcc/x86-transactional-memory-intrinsics.html