This commit is contained in:
Mylloon 2024-04-19 16:24:54 +02:00
parent e97e332c3f
commit 4ecc92f7ff
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

View file

@ -19,6 +19,9 @@ struct scheduler {
/* Mutex qui protège la structure */ /* Mutex qui protège la structure */
pthread_mutex_t mutex; pthread_mutex_t mutex;
/* Nombre de threads instanciés */
int nthreads;
/* Nombre de threads en attente */ /* Nombre de threads en attente */
int nthsleep; int nthsleep;
@ -50,6 +53,7 @@ sched_init(int nthreads, int qlen, taskfunc f, void *closure)
} else if(nthreads == 0) { } else if(nthreads == 0) {
nthreads = sched_default_threads(); nthreads = sched_default_threads();
} }
sched.nthreads = nthreads;
if(pthread_mutex_init(&sched.mutex, NULL) != 0) { if(pthread_mutex_init(&sched.mutex, NULL) != 0) {
fprintf(stderr, "Can't init mutex\n"); fprintf(stderr, "Can't init mutex\n");
@ -133,14 +137,18 @@ worker_routine(void *arg)
// S'il on a rien à faire // S'il on a rien à faire
if(s->top == -1) { if(s->top == -1) {
// tentative avec nthsleep???? pourquoi 10 aaaaa j'ai 12 coeurs??
s->nthsleep++; s->nthsleep++;
if(s->nthsleep >= 10) { if(s->nthsleep == s->nthreads) {
// Signal a tout les threads que il n'y a plus rien à faire
// si un thread attend une tâche
pthread_cond_broadcast(&s->cond);
pthread_mutex_unlock(&s->mutex); pthread_mutex_unlock(&s->mutex);
break; break;
} }
pthread_cond_wait(&s->cond, &s->mutex); pthread_cond_wait(&s->cond, &s->mutex);
s->nthsleep--;
pthread_mutex_unlock(&s->mutex); pthread_mutex_unlock(&s->mutex);
continue; continue;
} }
@ -153,13 +161,6 @@ worker_routine(void *arg)
// Exécute la tâche // Exécute la tâche
f(closure, s); f(closure, s);
// Signale s'il n'y a plus rien à faire
if(s->top == -1) {
pthread_mutex_lock(&s->mutex);
pthread_cond_broadcast(&s->cond);
pthread_mutex_unlock(&s->mutex);
}
} }
return NULL; return NULL;