2017-09-02 4 views
0

J'essaie d'utiliser pthread_cond_timedwait pour attendre avec un délai d'expiration similaire à Java wait(long timeout, int nanos). Je comprends que wait Java utilise un délai relatif, tandis que pthread_cond_timedwait utilise un seuil de temps absolu. Malgré cette prise en compte, pthread_cond_timedwait semble retourner immédiatement avec le code d'erreur ETIMEDOUT.pthread_cond_timedwait renvoie ETIMEDOUT immédiatement

L'exemple de programme ci-dessous imprime une valeur < 0. Je suppose qu'il doit imprimer une valeur> = 0.

Est-ce que je n'utilise pas correctement pthread_cond_timedwait? Comment est-ce que je réécrirais le programme ci-dessous pour ajouter un retard de par ex. 5 secondes?

#define _POSIX_C_SOURCE 199309L 

#include <stdio.h> 
#include <pthread.h> 
#include <time.h> 
#include <errno.h> 

int main(void) { 
    pthread_mutex_t mutex; 
    pthread_cond_t cond; 

    pthread_mutex_init(&mutex, NULL); 
    pthread_cond_init(&cond, NULL); 

    pthread_mutex_lock(&mutex); 

    struct timespec t1; 
    struct timespec t2; 

    clock_gettime(CLOCK_MONOTONIC, &t1); 

    t1.tv_sec += 5; 

    while(pthread_cond_timedwait(&cond, &mutex, &t1) != ETIMEDOUT); 

    clock_gettime(CLOCK_MONOTONIC, &t2); 

    printf("%d", t2.tv_sec - t1.tv_sec); 

    pthread_mutex_unlock(&mutex); 

    pthread_mutex_destroy(&mutex); 
    pthread_cond_destroy(&cond); 

    return 0; 
} 
+0

choix intéressant de la version POSIX - étaient pthreads partie? Avez-vous effectué une vérification d'erreur des appels système? Avez-vous envisagé d'imprimer quoi que ce soit dans le corps de la boucle while? Avez-vous envisagé d'imprimer les parties inférieures à la seconde? Sur quelle plateforme travaillez-vous? –

+0

@JonathanLeffler La version POSIX consiste à faire fonctionner CLOCK_MONOTONIC sur ideone.com. J'ai obtenu la solution de [link] https://stackoverflow.com/questions/40515557/compilation-error-on-clock-gettime-and-clock-monotonic [/ link]. Je travaille sur Android (NDK) mais la même chose arrive sur ideone.com (ils utilisent Linux je pense). Je n'ai rencontré aucun problème sauf avec pthread_cond_timedwait. Il revient juste immédiatement avec ETIMEDOUT. – fgsfdsfgts

+0

Je m'attendais à une version ultérieure de POSIX: Je crois 200809L est en cours, tandis que 200012L et 199506L étaient deux versions précédentes. Celles-ci correspondent aux valeurs '_XOPEN_SOURCE' de 700, 600, 500 respectivement. –

Répondre

5

Vous utilisez la mauvaise horloge. L'horloge par défaut utilisée par pthread_cond_timedwait est CLOCK_REALTIME. Si vous voulez vraiment utiliser CLOCK_MONOTONIC à la place, vous devez définir l'attribut d'horloge de votre variable condition:

pthread_condattr_t condattr; 
pthread_condattr_init(&condattr); 
pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC); 
pthread_cond_init(&cond, &condattr);