Threads et semaphores

liliefr2000 Messages postés 2 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 23 avril 2005 - 23 avril 2005 à 14:59
cminus Messages postés 4 Date d'inscription mercredi 19 octobre 2005 Statut Membre Dernière intervention 15 mars 2009 - 26 janv. 2006 à 23:08
bonjour


J'ai un probleme,je souhaite a l'aide de deux threads calculer la somme des entiers contenu dans un tableau..pour cela le premier thread va commence le tableau en partant de son debut et le deuxime thread va parcourir le tableau a partir de la fin.Ces deus threads doivent s'arreter lorsqu'il se rencontrerons et on aditionnera les deux somme obtenues.Le probleme est que si on autorise au deux thread d'acceder a la case du tableau ou il vont se rencontrer cette case sera comprise dans les deux sommes et donc additionnée deux fois.J'aimerai pour cela utiliser un semaphore qui controlera l'entree dans cette case.Mais je n'y arrive pas.Pouvez vous m'aider?.
Voiila le code sans semaphore:
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#define taille 5000000
#include <sys/types.h>
#include <sys/shm.h>
#include
#include <stdlib.h>



int i=0;
int j=taille-1;
int som1=0;
int som2=0;
int res, tab[taille];





void* pro1()
{
while(i<j)
{
som1=som1+tab[i];
i++;
}

pthread_exit(0);
}


void* pro2()
{
while(i<j)


{

som2=som2+tab[j];
j--;
}


pthread_exit(0);
}





int main()
{
int k;
pthread_t th1;
pthread_t th2;
void * ret;


for( k=0;k<=taille-1;k++)
{
tab[k]=1;
}


if(pthread_create(&th1,NULL,pro1,"1")<0)
{
fprintf(stderr,"pthread_create error for thread 1\n");
exit(1);
}


if(pthread_create(&th2,NULL,pro2,"2")<0)
{
fprintf(stderr,"pthread_create error for thread 2\n");
exit(1);
}


(void)pthread_join(th1,&ret);
(void)pthread_join(th2,&ret);
res=som1+som2;
printf("L'indice i : %d\n",i);
printf("L'indice j : %d\n",j);
printf("la somme des valeurs de tableaux est :%d \n",som1);
printf("la somme des valeurs de tableaux est :%d \n",som2);
printf("la somme des valeurs de tableaux est :%d \n",res);
}


Merci d'avance

5 réponses

dreamkiller_52 Messages postés 22 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 24 avril 2005
23 avril 2005 à 15:56
c'est un thread d'exclusion mutuel ou mutex qu'il te faut apparament(j suis pas sur) fait une recherche sur SetEvent () voila
0
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
24 avril 2005 à 21:18
Non ca ne peut pas etre ca car ce que dreamkiller propose c est une fonction de l'API windows alors que ton programme est POSIX.

Desole de ne pas t apporter une reponse, mais en tout cas ce n'est pas SetEvent()
0
dreamkiller_52 Messages postés 22 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 24 avril 2005
24 avril 2005 à 23:00
????
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
24 avril 2005 à 23:31
Salut,

pourquoi tu vas à la fin avec un de tes threads

au lieu de lire les indices pairs pour un thread et impair pour l'autre ?

Tu n'auras pas besoin de mutex comme ça, chaque thread lisant

son jeu propre d'indice. En plus tu ne parcours pas le tableau

pour rien.


Ma participation à la saturation du net:
http://hylvenir.free.fr
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cminus Messages postés 4 Date d'inscription mercredi 19 octobre 2005 Statut Membre Dernière intervention 15 mars 2009
26 janv. 2006 à 23:08
Comme tu les threads n'accèdent qu'en lecture au tableau, il n'y besoin ni de sémphore ni de mutex.
Laisse les threads aller au bout de leurs boucles ensuite faire la moyenne si on veut !

Salutations

MINUS
0
Rejoignez-nous