linux dormir avec clock_nanosleep
Je veux utiliser clock_nanosleep pour l'attente de la 1 microsec.. Comme je le comprends, je dois donner un temps absolu comme entrée. Est le code suivant ok dans ce cas?
deadline.tv_sec = 0;
deadline.tv_nsec = 1000;
clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &deadline, NULL);
quel est la page de manuel de dire, et lorsque vous avez essayé, qu'avez-vous observer?
Il dit que je dois utiliser TIMER_ABSTIME afin de mettre en temps absolu. Cependant, il semble qu'il y ait quelque chose de mal avec ma mise en œuvre.
Je suis assez sûr qu'ici, plus qu'une microseconde a passé depuis l'époque, mais puisque vous n'avez pas dit pourquoi il semble que quelque chose est incorrect avec votre mise en œuvre, il pourrait être différent à votre emplacement.
Vous pouvez utiliser
Il dit que je dois utiliser TIMER_ABSTIME afin de mettre en temps absolu. Cependant, il semble qu'il y ait quelque chose de mal avec ma mise en œuvre.
Je suis assez sûr qu'ici, plus qu'une microseconde a passé depuis l'époque, mais puisque vous n'avez pas dit pourquoi il semble que quelque chose est incorrect avec votre mise en œuvre, il pourrait être différent à votre emplacement.
Vous pouvez utiliser
TIMER_ABSTIME
pour définir le temps absolu, ou 0
pour définir un temps relatif. Il semble que vous souhaitez faire la dernière.
OriginalL'auteur Avb Avb | 2013-12-02
Vous devez vous connecter pour publier un commentaire.
Non, le
flags
argument vous permet de choisir relatif ou absolu du temps. Vous souhaitezpour spécifier la microseconde à partir de maintenant.
Aucune idée, vous aurez à mesurer. Mais si la performance est un problème, alors pourquoi dormez-vous?
Peut-être la performance est la mauvaise formulation. J'aurais du dire une meilleure précision en termes de temps de sommeil.
OriginalL'auteur Mike Seymour
Votre date limite tv n'est pas un temps absolu. Pour former un temps absolu, obtenir l'heure actuelle avec
clock_gettime()
(http://linux.die.net/man/3/clock_gettime), puis d'ajouter votre sommeil intervalle.Remarque que je suis en utilisant CLOCK_MONOTONIC au lieu de CLOCK_REALTIME. Vous n'avez pas de soins de l'heure qu'il est, vous voulez juste de l'horloge pour être cohérent.
Bon point. Seulement si vous êtes inquiet au sujet de signaux, dans ce cas, vous avez encore de gérer le début du retour de vous-même, ou si vous voulez dormir répétés d'intervalles et de minimiser la dérive, dans ce cas, vous auriez calculer la nouvelle échéance de la date limite antérieure plutôt que de partir de l'heure actuelle.
J'avais besoin de cela parce que je suis l'élaboration d'un thread qui s'exécute périodiquement afin de tester un algorithme d'ordonnancement. Donc, je ne peux pas utiliser la durée relative, parce que cela va accumuler de l'erreur. Donc, cela pourrait être une telle demande.
il est vraiment bon. si le code de la normalisation peut traiter le cas maintenant.tv_nsec + nanos_you_want_it_to_sleep >= 2 secondes, ça serait parfait.
Cela peut arriver si vous ajoutez plus de 1 seconde. De le faire dans l'exemple ci-dessus, ajouter l'ensemble de secondes à la tv_sec champ et que les fractions de secondes à la tv_nsec champ (comme l'a fait ci-dessus). Puis la normalisation ci-dessus fonctionne très bien. Méfiez-vous des débordements si vous utilisez des nanos pour représenter plusieurs secondes... dans certaines implémentations, tv_nsec débordera un peu plus de 2 secondes.
OriginalL'auteur Peter
@ryanyuyu
exemple de code::
c'est monotone en fonction de l'horloge fonction de veille.
veuillez vous référer.
OriginalL'auteur cpplover - Slw Essencial
Je recommande 2ème façon d'utiliser la fonction de veille.
parce que , en plus de la fonction du système utilise CLOCK_REALTIME, Mais, Il a un problème sérieux,
Si le système de l'heure et de la date a changé.
Dans la plupart des cas je recommande relative sommeil façon , le meilleur choix est d'utiliser clock_monotonic.
OriginalL'auteur cpplover - Slw Essencial