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