Thread le wait ne semble pas relocker

Fermé
math 2000 Messages postés 2605 Date d'inscription dimanche 9 septembre 2007 Statut Membre Dernière intervention 7 mai 2016 - Modifié par math 2000 le 27/10/2013 à 19:47
math 2000 Messages postés 2605 Date d'inscription dimanche 9 septembre 2007 Statut Membre Dernière intervention 7 mai 2016 - 12 nov. 2013 à 20:06
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

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 dimanche 9 septembre 2007 Statut Membre Dernière intervention 7 mai 2016 404
Modifié par math 2000 le 12/11/2013 à 20:12
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