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;
}
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? –
@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
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. –