Thread le wait ne semble pas relocker

math 2000 Messages postés 2605 Date d'inscription   Statut Membre Dernière intervention   -  
math 2000 Messages postés 2605 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

j'aimerais juste faire une simple discution entre threads pour m'entrainer
mais lorsque je récupère l'information avec mon pthread_cond_wait le second thread continue de s'exécuter .

par exemple la discution entre une personne qui demande quelque chose et l' autre qui l'offre me donne:
envoie moi un truc stp 
debut de l'envoie
de rien
merci

alors que le de rien ne devrais pas s'executer vu que le wait à reçu son signal et devrait relocker le mutex

voici le code je n'y comprend plus rien merci .


#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER;
void *function1();
void *function2();


main()
{
pthread_t thread1, thread2;
pthread_create( &thread1, NULL, &function1, NULL);
pthread_create( &thread2, NULL, &function2, NULL);
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
exit(0);
}


void *function2()
{
pthread_mutex_lock( &count_mutex );
printf("envoie moi un truc stp \n");
pthread_cond_wait( &condition_var, &count_mutex );
printf("merci \n");
pthread_mutex_unlock( &count_mutex );
}

// Write numbers 4-7

void *function1()
{
pthread_mutex_lock( &count_mutex );
printf("debut de l'envoie \n");
pthread_cond_signal( &condition_var );
printf("de rien \n");
pthread_mutex_unlock( &count_mutex );
}


2 réponses

Antoine
 
Bonjour,

Il me semble que tes fonctions sont mal définies.
void *function1();

void *function2();

Les routines du thread prenne un argument, un pointeur sur n'importe quoi. On passe donc les paramètres par un pointeur. Là, il faut lire la documentation de pthread.

Ensuite, il me semble que le mutex n'est jamais créé. Ça pourrait expliquer certaines choses...

Enfin, pthread_join prend en paramètre un tableau de threads. Il n'est d'ailleurs pas judicieux de faire à la suite :
pthread_join( thread1, NULL);

pthread_join( thread2, NULL);
Il faut plutôt attendre les deux ensemble; c'est d'ailleurs le but de la fonction. Il faut stocker les threads dans un tableau.

Bref, il faut lire la documentation de pthread et éventuellement regarder les exemples qui vont avec.
0
math 2000 Messages postés 2605 Date d'inscription   Statut Membre Dernière intervention   405
 
merci je vais tester celà mais je ne vois pas ce qu'il faut changer dans la déclaration de mes fonction qui sont en fait des procédures sans paramètre j

pour mon pointeur il est crée en tout début pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
0