x86 GCC блок сна или спина? - PullRequest
0 голосов
/ 26 марта 2011

Как бы я сделал версию сна в C spin, чтобы он использовал циклы процессора?

Ответы [ 3 ]

4 голосов
/ 26 марта 2011

Полагаю, что-то вроде (псевдокод)

while (time < endtime)
    ; 

Реализация «time

2 голосов
/ 26 марта 2011

То, что вы хотите сделать, это занятое ожидание , когда вы зацикливаетесь, пока не истечет определенное количество времени.Просто получите текущее время (используя таймер наивысшей точности из доступных) и выполните цикл до тех пор, пока текущее время не станет определенным периодом времени после запуска.

Вот конкретный пример использования API-интерфейса Windows и счетчика производительности с использованием двухсвязанные функции, QueryPerformanceCounter() и QueryPerformanceFrequency().

void Sleep_spin(DWORD dwMilliseconds)
{
    LARGE_INTEGER freq, target, current;

    /* get the counts per second */
    if (!QueryPerformanceFrequency(&freq)) { /* handle error */ }

    /* set target to dwMilliseconds worth of counts */
    target.QuadPart = freq.QuadPart * dwMilliseconds / 1000;

    /* get the current count */    
    if (!QueryPerformanceCounter(&current)) { /* handle error */ }

    /* adjust target to get the ending count */
    target.QuadPart += current.QuadPart;

    /* loop until the count exceeds the target */
    do
    {
        if (!QueryPerformanceCounter(&current)) { /* handle error */ }
    } while (current.QuadPart < target.QuadPart);
}

Используйте соответствующий API в вашем случае, что бы это ни было.

0 голосов
/ 26 марта 2011

Вам нужно что-то большее, чем просто

for (; ; ) ;

?

...