(6.9.2.3p1) Реализация может предполагать, что любой поток в конечном итоге выполнит один циклиз следующего:
- завершить,
- вызвать функцию std::this_thread:: yield ([thread.thread.this]),
- вызов функции библиотечного ввода-вывода,
- выполнение доступ через изменчивое значение glvalue,
- выполнение операции синхронизации или атомарной операции, или
- продолжение выполнения тривиальный бесконечный цикл ([stmt.iter.general]). [Добавлено в C++23]
Для целей пункта 5 считается ли ограничение «операцией синхронизации или атомарной Operation"? Если у нас есть нетривиальный бесконечный цикл, тело которого содержит atomic_signal_fence() илиatomic_thread_fence(), но нет других побочных эффектов, вызывает ли это неопределенное поведение?
Я не думаю, что где-либо в стандарте существует четкое определение или исчерпывающий список «атомарных операций». Atomics.fences вместо этого описывает их как «примитивы синхронизации», и, возможно, здесь нет смысла считать заборы наблюдаемыми эффектами, потому что на самом деле они не имеют никаких собственных наблюдаемых эффектов. С другой стороны,atomics.order p4, в другом контексте, говорит об общем порядке «всех операций Memory_order::seq_cst, включая ограничения», предполагая, что они считаются «операциями».
Бонусный вопрос: имеет ли значение, если забор имеет порядок Memory_order_relaxed, который явно определен как не имеющий эффекта?
gcc и clang здесь, кажется, все по-другому. Данный код типа
Код: Выделить всё
bool b = true;
while (b) {
std::atomic_signal_fence(std::memory_order_relaxed);
}
С другой стороны, gcc выдаст бесконечный пустой цикл, хотя он с радостью удалит такие циклы без ограждения.
Более подробный пример для godbolt.
То же самое происходит и для других порядков памяти, и дляatomic_thread_fence (в последнем случае gcc генерирует бесконечный цикл с инструкцией барьера).
Подробнее здесь: https://stackoverflow.com/questions/786 ... ude-fences