#include <threads.h>
void thrd_yield();
Cette fonction permet de rendre la main à l'ordonnaceur de tâches (si le thread doit patienter) pour la période de temps d'exécution en cours.
Cette fonction définit aucun paramètre.
La fonction thrd_yield
ne renvoie rien.
Pour rappel, la structure timespec
permet de représenter un temps, ou une durée, exprimer en secondes et en nanosecondes.
De plus, 1 seconde vaut 1000 millisecondes, 1000000 microsecondes et 1000000000 nanosecondes (souvent, on m'oublie les microsecondes).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <threads.h> #define MILLION 1000000 #define MILLIARD 1000000000 // Une fonction permettant d'attendre un certains nombre de millisecondes // sans fracasser le processeur, grâce à la function thrd_yield. void mySleep( long milliseconds ) { // Calcul de l'instant de départ. struct timespec start; timespec_get( &start, TIME_UTC ); // Calcul de l'instant ou la fonction doit rendre la main. struct timespec end = start; long new_nsec = end.tv_nsec + milliseconds * MILLION; end.tv_sec += new_nsec / MILLIARD; end.tv_nsec = new_nsec % MILLIARD; // On patiente jusqu'à arriver à end. struct timespec current; while ( true ) { timespec_get( ¤t, TIME_UTC ); if ( current.tv_sec < end.tv_sec ) { thrd_yield(); // On patiente } else if ( current.tv_sec > end.tv_sec || current.tv_nsec > end.tv_nsec ) { break; // On sort } else { thrd_yield(); // On patiente } } } int main() { printf( "On patiente 5 secondes...\n" ); mySleep( 5000 ); printf( "C'est fini !\n" ); return EXIT_SUCCESS; } |
Pour compiler cet exemple sous environnement Linux/Unix, il est nécessaire de lier la librairie pthread (Posix Thread) à votre exécutable. Voici un exemple de compilation.
$> gcc -o sample sample.c -lpthread $>
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :