6.57.12 Встроенные функции для транзакционной памяти X86
Встроенные функции для транзакционной памяти аппаратного обеспечения для i386. Они позволяют использовать транзакции памяти с RTM (ограниченной транзакционной памятью). Для использования HLE (исключения блокировки аппаратного обеспечения) используйте вместо этого расширения модели памяти X86, специфичные для транзакционной памяти. Эта поддержка включена с опцией -mrtm.
Транзакция памяти атомарно фиксирует все изменения в памяти, видимые для других потоков. Если транзакция завершается неудачно, она отменяется, и все побочные эффекты отбрасываются.
В целом нет гарантии, что транзакция памяти всегда завершится успешно, и всегда необходимо предоставлять код для обработки сбоя.
Начать транзакцию RTM (ограниченной транзакционной памяти). Возвращает _XBEGIN_STARTED, если транзакция началась успешно (обратите внимание, что это не 0, поэтому константу необходимо явно проверить). Когда транзакция прерывается, все побочные эффекты отменяются, и возвращается код прерывания. Нет гарантии, что любая транзакция когда-либо завершится успешно, поэтому всегда необходимо иметь действительный путь обработки сбоя.
#include <immintrin.h>
if ((status = _xbegin ()) == _XBEGIN_STARTED) {
... transaction code...
_xend ();
} else {
... non transactional fallback path...
} Действительные биты состояния прерывания (когда значение не равно _XBEGIN_STARTED) следующие:
_XABORT_EXPLICIT- Транзакция явно прервана с помощью
_xabort. Переданный параметр в_xabortдоступен с помощью_XABORT_CODE(status) _XABORT_RETRY- Возможен повторный запуск транзакции.
_XABORT_CONFLICT- Прерывание транзакции из-за конфликта памяти с другим потоком
_XABORT_CAPACITY- Прерывание транзакции из-за того, что транзакция использует слишком много памяти
_XABORT_DEBUG- Прерывание транзакции из-за отладки
_XABORT_NESTED- Прерывание транзакции во внутренней вложенной транзакции
Закрепить текущую транзакцию. Если активной транзакции нет, произойдёт ошибка. Все побочные эффекты транзакций станут видимы для других потоков атомарным образом.
Возвращает ненулевое значение, если активна текущая транзакция, в противном случае 0.
Прервать текущую транзакцию. Если активной транзакции нет, это бесполезно. status должен быть константой длиной 8 бит, которая включена в код состояния, возвращённый
_xbegin
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/X86-transactional-memory-intrinsics.html