Bonjour,
J'ai un soucis avec un programme:
Dans le cadre d'un TP, je dois réaliser un programme en C sous linux centOS. Ce programme doit exécuter deux threads. Chaque thread traite la moitié d'un tableau en multipliant cette moitié par lui même puis effectue le tri.
Mon programme (Voir ci-dessous) se compile correctement mais au moment de l'exécution j'ai le message:"Erreur segmentation"
Je suis passé par gdb pour déburguer mon programme et le résultat est le suivant:
Program received signal SIGSEGV, Segmentation fault.
0x08048846 in main (ac=<value optimized out>, av=<value optimized out>) at td1.c:71
71 tab1->debut=0;
je sais pas trop quel est mon erreur. si quelqu'un pouvait me clairer. Merci
Voici mon programme:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
 
#define N 14
static pthread_rwlock_t verrou=PTHREAD_RWLOCK_INITIALIZER; //permet l'exclusion mutuelle
static int tab[N]={7, 4, 3, 12, 20, 9, 15, 31, 25, 19, 28, 40, 47,39};
static int i;
 
struct borne {
	int debut;
	int fin;
	};
 
struct borne *tab1;
struct borne *tab2;
 
//fonction Multiplier exécuté par les deux threads
void *multi (void * para)
{
			tab1=(struct borne *) para;
			int n=0;
			sleep(5);
 			pthread_rwlock_rdlock (&verrou);
			for (i=tab1->debut;i<=tab1->fin;i++){
				n=tab[i];
				tab[i]=n*n;
				printf ("Nouvelle valeur à la position %d du tableau: %d * %d = %d\n",i, n, n, tab[i]);
				}
			pthread_rwlock_unlock (&verrou);
			pthread_exit (0);
			}
 
//fonction Trier exécuté par les deux threads
void *trier (void * para)
{
			tab2=(struct borne *) para;
			int a=0;
			int changement=1;
			sleep(5);
 			pthread_rwlock_rdlock (&verrou);
			while(changement>0){      //tant qu'il ya des valeurs à échanger
					changement=0;               // on réinitialise changement quand la boucle repart
					for(i=tab2->debut;i<=tab2->fin;i++){               
						if(tab[i+1]<tab[i]){                 //on compare chaque élément à son voisin
							a=tab[i];                           //on les interverti si nécessaire
							tab[i+1]=tab[i];
							a=tab[i];
							changement++;               //on signale qu'il ya eu un changement
							}
						}
					}
			a=0;
			printf ("Voici la mmoitié du tableau trié: \n");
			for (a=tab2->debut;a<=tab2->fin;a++)
				printf ("N°: %d = %d\n", a, tab2[a]);
			pthread_rwlock_unlock (&verrou);
			pthread_exit (0);
				}
 
main (int ac, char **av)
			{
  			//déclaration des threads
  			pthread_t t1, t2;
  			void *attente;
  			i=0;
 			//initilaisation du verrou
 			// pthread_rwlock_init (&verrou, PTHREAD_RWLOCK_INITIALIZER);
 
			//creation du thread 1
			tab1->debut=0;
			tab1->fin=6;
 
			if (pthread_create (&t1, NULL, multi, (void *) tab1) < 0) {
    			fprintf (stderr, "erreur lors de la creation du thread 1\n");
    			exit (1);
  			}
 
			if (pthread_create (&t1, NULL, trier, (void *) tab1) < 0) {
    			fprintf (stderr, "erreur lors de la creation du thread 1\n");
    			exit (1);
  			}
 
			//creation du thread 2
			tab2->debut=7;
			tab2->fin=13;
 
			if (pthread_create (&t1, NULL, multi, (void *) tab2) < 0) {
    			fprintf (stderr, "erreur lors de la creation du thread 1\n");
    			exit (1);
  			}
 
			if (pthread_create (&t1, NULL, trier, (void *) tab2) < 0) {
    			fprintf (stderr, "erreur lors de la creation du thread 1\n");
    			exit (1);
  			}
 
			//attente de la fin du thread 1
  			(void)pthread_join (t1, &attente);
  			//attente de la fin du thread 2
			(void)pthread_join (t2, &attente);
}