Rechercher
 

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 :

Fonction thrd_yield (C ISO 2011)

La type thrd_t


Entêtes à  inclure

#include <threads.h>

Fonction thrd_yield

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.

Paramètres

Cette fonction définit aucun paramètre.

Valeur de retour

La fonction thrd_yield ne renvoie rien.

Exemple de code

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( &current, 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;
}
Fichier sample.c : exemple d'utilisation de la fonction thrd_yield

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
$>

Fonctions et types connexes

thrd_sleep


La type thrd_t