Spec-Zone.ru › GCC 4

6.57.12 Встроенные функции для транзакционной памяти X86

Встроенные функции для транзакционной памяти аппаратного обеспечения для i386. Они позволяют использовать транзакции памяти с RTM (ограниченной транзакционной памятью). Для использования HLE (исключения блокировки аппаратного обеспечения) используйте вместо этого расширения модели памяти X86, специфичные для транзакционной памяти. Эта поддержка включена с опцией -mrtm.

Транзакция памяти атомарно фиксирует все изменения в памяти, видимые для других потоков. Если транзакция завершается неудачно, она отменяется, и все побочные эффекты отбрасываются.

В целом нет гарантии, что транзакция памяти всегда завершится успешно, и всегда необходимо предоставлять код для обработки сбоя.

— Функция RTM: unsigned _xbegin ()

Начать транзакцию 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
Прерывание транзакции во внутренней вложенной транзакции
— Функция RTM: void _xend ()

Закрепить текущую транзакцию. Если активной транзакции нет, произойдёт ошибка. Все побочные эффекты транзакций станут видимы для других потоков атомарным образом.

— Функция RTM: int _xtest ()

Возвращает ненулевое значение, если активна текущая транзакция, в противном случае 0.

— Функция RTM: void _xabort (status)

Прервать текущую транзакцию. Если активной транзакции нет, это бесполезно. 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API