Comment dormir pendant quelques microsecondes

Considérons le code suivant:

#include <stdio.h>
#include <time.h>
#include <math.h>

//Compile with gcc -lrt -lm -o test_clock test_clock.c

#define CLOCK CLOCK_MONOTONIC

int main(int argc, char** argv) {
    double temp, elapsed;
    int j;
    struct timespec requestStart, requestEnd, req;

    //Pseudo-sleep
    clock_gettime(CLOCK, &requestStart);
    temp = 0;
    for(j=0; j < 40; j++)
        temp += sin(j);
    clock_gettime(CLOCK, &requestEnd);
    elapsed = ( requestEnd.tv_sec - requestStart.tv_sec ) / 1e-6
                 + ( requestEnd.tv_nsec - requestStart.tv_nsec ) / 1e3;
    printf("Elapsed: %lf us\n", elapsed);

    //Nanosleep
    clock_gettime(CLOCK, &requestStart);
    req.tv_nsec = 5000;
    req.tv_sec = 0;
    clock_nanosleep(CLOCK, 0, &req, NULL);
    clock_gettime(CLOCK, &requestEnd);
    elapsed = ( requestEnd.tv_sec - requestStart.tv_sec ) / 1e-6
                 + ( requestEnd.tv_nsec - requestStart.tv_nsec ) / 1e3;

    printf("Elapsed: %lf us\n", elapsed);

}

Sur mon 2.6.32 système, le résultat est

Elapsed: 5.308000 us
Elapsed: 69.142000 us

Je suis d'accord que c'est plus probablement parce nanosleep() demande au noyau de reporter le processus. Comment puis-je éviter cela? Je veux conserver la propriété de la CPU et de la juste ralenti autour d'une certaine quantité de temps.

Vous avez à la fois linux et le temps réel comme des balises. Pourquoi? Ils sont la craie et le fromage.
Ce n'est pas comme il y a un fou des gens qui travaillent sur linux-rt ou quelque chose comme ça... oh wait.
Jack de tous les métiers.....
Je suis intrigué: Quel est exactement le contexte? Quels sont que vous avez besoin de ce genre de précision?
des commentaires en temps réel le contrôle des plasmas confinés magnétiquement.

OriginalL'auteur Nikratio | 2011-02-13