6.53 x86-специфичные расширения модели памяти для транзакционной памяти
Архитектура i386 поддерживает дополнительные флаги упорядочивания памяти для маркировки критических секций блокировки для устранения аппаратных блокировок. Они должны быть указаны дополнительно к существующей модели памяти для атомарных встроенных функций.
__ATOMIC_HLE_ACQUIRE- Начало устранения блокировки по переменной блокировки. Модель памяти должна быть
__ATOMIC_ACQUIREили сильнее. __ATOMIC_HLE_RELEASE- Окончание устранения блокировки по переменной блокировки. Модель памяти должна быть
__ATOMIC_RELEASEили сильнее.
Когда приобретение блокировки терпит неудачу, для хорошей производительности требуется быстро прервать транзакцию. Это можно сделать с помощью _mm_pause
#include <immintrin.h> // For _mm_pause
int lockvar;
/* Acquire lock with lock elision */
while (__atomic_exchange_n(&lockvar, 1, __ATOMIC_ACQUIRE|__ATOMIC_HLE_ACQUIRE))
_mm_pause(); /* Abort failed transaction */
...
/* Free lock with lock elision */
__atomic_store_n(&lockvar, 0, __ATOMIC_RELEASE|__ATOMIC_HLE_RELEASE);
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/x86-specific-memory-model-extensions-for-transactional-memory.html