Понятие забора компилятора часто возникает, когда я читаю о моделях памяти, барьерах, упорядочивании, атомизме и т.д., но обычно это в контексте также сопрягается с забор CPU, как и следовало ожидать.
Иногда, однако, я читал о конструкциях ограждений, которые только относятся к компилятору. Примером этого является функция С++ 11 std::atomic_signal_fence
, которая указывает на cppreference.com:
std:: atomic_signal_fence эквивалентен std:: atomic_thread_fence, за исключением центрального процессора выдается инструкция по упорядочению памяти. Только переупорядочение инструкции компилятора подавляются в соответствии с инструкциями по заказу.
У меня есть пять вопросов, связанных с этой темой:
-
Как подразумевается имя
std::atomic_signal_fence
, это асинхронное прерывание (такое как поток, который выгружается ядром для выполнения обработчика сигнала) > , в котором полезен забор только для компилятора? -
Используется ли его применимость ко всем архитектурам, включая сильно упорядоченные, такие как
x86
? -
Может ли быть представлен конкретный пример, чтобы продемонстрировать полезность забора только для компилятора?
-
При использовании
std::atomic_signal_fence
существует ли разница между использованием порядкаacq_rel
иseq_cst
? (Я бы ожидал, что это не имеет значения.) -
Этот вопрос может быть затронут первым вопросом, но я достаточно любопытен, чтобы спросить об этом в любом случае: нужно ли когда-либо использовать заграждения с помощью
thread_local
accesses? (Если бы это было когда-либо, я ожидал бы, что выбор из компилятора, такой какatomic_signal_fence
, станет инструментом выбора.)
Спасибо.