Récemment, j'ai essayé de créer une fonction d'attente qui attend 25 ms en utilisant l'horloge murale comme référence. J'ai regardé autour de moi et j'ai trouvé "gettimeofday", mais j'ai eu des problèmes avec ça. Mon code (simplifié):gettimeofday sur uLinux wierd behavior
while(1)
{
timeval start, end;
double t_us;
bool release = false;
while (release == false)
{
gettimeofday(&start, NULL);
DoStuff();
{
gettimeofday(&end, NULL);
t_us = ((end.tv_sec - start.tv_sec) * 1000*1000) + (end.tv_usec - start.tv_usec);
if (t_us >= 25000) //25 ms
{
release = true;
}
}
}
}
Ce code fonctionne dans un thread (Posix), et il est lui-même, fonctionne très bien. DoStuff() est appelé toutes les 25ms. Il mange cependant tout le CPU s'il le peut (comme vous pouvez vous y attendre) alors évidemment ce n'est pas une bonne idée.
Lorsque j'ai essayé de l'étrangler en ajoutant un Sleep (1); dans la boucle d'attente après l'instruction if, la chose entière ralentit d'environ 50% (c'est-à-dire qu'elle s'appelle DoStuff toutes les 37 ms environ) Cela n'a aucun sens - en supposant que DoStuff et tous les autres threads terminent leurs tâches en dessous. 1) ms le taux de DoStuff appelé ne doit pas être affecté (permettant une marge d'erreur 1ms)
Je dors aussi essayé (0), usleep (1000) et usleep (0) mais le comportement est le même.
le même comportement se produit chaque fois un autre thread de priorité plus élevée a besoin de temps CPU (sans le sommeil). Il est comme si l'horloge cesse de compter lorsque le fil
runtime reliqnuishes. Je suis conscient que gettimeofday est vulnérable à des choses comme NTP updat es etc ... donc j'ai essayé d'utiliser clock_gettime mais relier -ltr sur mon système provoque des problèmes donc je ne pense pas que ce soit une option.
Est-ce que quelqu'un sait ce que je fais mal?
Le code de la question est-il correct? Le 'while (release == false)' semble mal placé. –
Une façon courante de dormir un peu sur les plateformes POSIX est d'utiliser la fonction ['select'] (http://linux.die.net/man/2/select). Aussi, si votre compilateur le supporte vous avez aussi ['std :: this_thread :: sleep_for'] (http://en.cppreference.com/w/cpp/thread/sleep_for). –
@Joachim Oui, j'ai oublié les parantheses de boucle while - corrigé. – Lordmonkey