Спать без системных или IO звонков
Мне нужен режим сна, который не выдает никаких системных или IO-вызовов для сценария с аппаратной транзакционной памятью (эти вызовы могут привести к прерыванию). Спать в течение 1 микросекунды, как в usleep(1)
было бы просто отлично.
Этот вопрос предлагает реализовать вложенные циклы, чтобы сохранить занятость программы и задержать ее на некоторое время. Тем не менее, я хочу быть в состоянии скомпилировать с оптимизацией, которая удалила бы эти циклы.
Идея может состоять в том, чтобы вычислить сложное математическое уравнение. Есть ли подходы к этому? Фактическое время ожидания не должно быть точным - однако, оно должно быть примерно одинаковым для нескольких прогонов.
3 ответа
Попробуйте nop
петля с летучим asm
директива:
for (int i = 0; i < 1000; i++) {
asm volatile ("nop");
}
Изменчивый должен препятствовать тому, чтобы оптимизатор избавился от этого. Если это не сработает, попробуйте __volatile__
,
Вы можете использовать этот код:
#include <time.h>
void delay(int n)
{
n *= CLOCKS_PER_SEC / 1000;
clock_t t1 = clock();
while (clock() <= t1 + n && clock() >= t1);
}
Иногда (не очень часто) эта функция вызывает меньшую задержку, чем указано, из-за переполнения счетчика тактовых импульсов.
Обновить
Другой вариант - использовать такие петли с volatile
счетчики.
Сложная часть здесь - это время. Запрос любого таймера может считаться функцией ввода-вывода, в зависимости от ОС.
Но если вы просто хотите цикл задержки, когда время не так важно, вам следует обратиться к программному коду. Например, есть специфичная для Intel встроенная функция, называемая _mm_pause
это переводит на процессор pause
инструкция, которая в основном останавливает конвейер до следующей синхронизации шины памяти. Он был разработан для помещения в цикл спин-блокировки (нет смысла вращать и запрашивать атомарную переменную до тех пор, пока не появится возможность получения новой информации), но он может (может - читать документацию) помешать компилятору удалить цикл задержки как пустой,