Я заметил, что многие блокирующие алгоритмы, реализованные с использованием специфичных для ОС примитивов, таких как блокировки спинов, описанные здесь здесь (которые используют специфические для Linux атомные примитивы), часто делают использование инструкции "cpu relax". С помощью GCC это может быть достигнуто с помощью:
asm volatile("pause\n": : :"memory");
В частности, эта команда часто используется в теле while
блокировок спина цикла, ожидая, пока переменная будет установлена на определенное значение.
С++ 11, похоже, не предоставляет какой-либо переносной инструкции типа "cpu_relax". Есть ли причина для этого? И действительно ли оператор "пауза" выполняет что-нибудь полезное?
Edit:
Кроме того, я бы спросил: почему комитет по стандартам С++ 11 не решил включить общий std::cpu_relax()
или что-то еще? Сложно ли гарантировать переносимость?