[Erreur de segmentation] mémoire partagée avec les thread
Fermé
andjkoy
Messages postés1Date d'inscriptionsamedi 22 février 2020StatutMembreDernière intervention22 février 2020
-
22 févr. 2020 à 14:19
Bonjour à tous,
Je suis un cours de programmation système mais je suis débutant. On m'a donc confié un projet, celui de réaliser le crible d'Eratosthene à l'aide des mémoires partagée. J'ai donc décidé de le faire en créant deux thread, l'un rempli un segment de mémoire partagée et l'autre supprime les éléments non premiers. Voici un code que j'ai écrit mais qui ne marche pas à cause du segmentation fault lors de l'exécution
pthread_cond_t condition = PTHREAD_COND_INITIALIZER; /* Création de la condition */ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; /* Création du mutex */
int main(int argc, int argv[]){ pthread_t thread1, thread2; int n, shmidRemplissage, shmidSuppression; printf("Donner le max : "); scanf("%d", &max); //creation d'un segment de memoire qu'on remplira //par 0, 1,..., max shmidRemplissage=shmget(IPC_PRIVATE, max*sizeof(int), IPC_CREAT|0666); tab=(int*)shmat(shmidRemplissage, NULL, 0); //remplissage de tab par thread1 pthread_create(&thread1, NULL, remplissage, NULL); //Pour tester le remplissage for (int i = 0; i < max; i++) { printf("%d ", tab[i]); }
shmdt(tab); //detachement du segment
//creation d'un second segment de memoire shmidSuppression=shmget(IPC_PRIVATE, maxPremier*sizeof(int), IPC_CREAT|0666); premier=(int*)shmat(shmidSuppression, NULL, 0); //suppression des nombres non premiers dans la zone memoire pthread_create(&thread2, NULL, suppression, NULL);
//Pour tester si la suppression s'est bien passee for (int i = 0; i < maxPremier; i++) { printf("%d ", premier[i]); } printf("\n");
shmdt(premier); pthread_join (thread1, NULL); pthread_join (thread2, NULL); /* Attente de la fin des threads */
}
void* remplissage(void* arg) { pthread_mutex_lock (&mutex); /* On verrouille le mutex */ printf("Remplissage des nombres dans le segment\n"); for (int i = 0; i < max; i++) { tab[i]=i; } pthread_cond_signal (&condition); /* On délivre le signal : condition remplie */ pthread_mutex_unlock (&mutex); /* On deverrouille le mutex */ pthread_exit(NULL); /* Fin du thread */
}
void* suppression(void* arg) { int *supprimes; supprimes=(int*)malloc((max)*sizeof(int)); supprimes[1]=1; supprimes[0]=1; for (int i = 2; i < max; i++) supprimes[i]=0; for (int i = 2; i < max; i++){ for (int j = i+1; j < max; j++) { if(j%i==0) supprimes[j]=1; }
} pthread_mutex_lock (&mutex); /* On verrouille le mutex */ pthread_cond_wait (&condition, &mutex); /* On attend que la condition soit remplie */ printf("Suppression des nombres non premier du" "segment et copie des premier dans le deuxieme segment\n"); for (int i = 0; i <= max; i++) if (!supprimes[i]){ premier[maxPremier]=i; ++maxPremier; } pthread_mutex_unlock (&mutex); /* On deverrouille le mutex */ pthread_exit(NULL); /* Fin du thread */
}
Aidez à remedier à cela svp.
Merci d'avance
A voir également:
[Erreur de segmentation] mémoire partagée avec les thread