pthread (erreur de segmentation)
Je suis coréenne et je ne suis pas très bonne en anglais mais si vous me donnez un commentaire là-bas
Je vais être très heureux et essayer de la comprendre.
J'ai créé, par exemple, 10 threads et a essayé de se joindre à eux après la création et le retour de la valeur.
Mais lorsque je rejoins le dernier thread, j'obtiens une erreur de segmentation.
Le résultat sort comme ça..
Before Thread 1 create
After Thread 1 create
Before Thread 0 create
After Thread 0 create
Before Thread 1 join
After Thread 1 join
Before Thread 0 join
Segmentation Fault(core dumped)
quand j'ai créer 4 fils, c'est comme
Before Thread 3 create
After Thread 3 create
Before Thread 2 create
After Thread 2 create
Before Thread 1 create
After Thread 1 create
Before Thread 0 create
After Thread 0 create
Before Thread 3 join
After Thread 3 join
Before Thread 2 join
After Thread 2 join
Before Thread 1 join
After Thread 1 join
Before Thread 0 join
Segmentation Fault(core dumped)
Je n'arrive pas à trouver pourquoi.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t mutex_lock;
struct arg_struct {
int a;
int b;
};
void *t_function(void *data) {
pthread_mutex_lock(&mutex_lock);
struct arg_struct *arg = (struct arg_struct *)data;
long int s;
s = arg->a;
pthread_mutex_unlock(&mutex_lock);
return (void **)s;
}
int main()
{
int i;
pthread_t p_thread[2];
int thr_id;
int status;
struct arg_struct arg[2];
for(i = 1; i >= 0; i--) {
arg[i].a = i;
arg[i].b = i;
}
pthread_mutex_init(&mutex_lock, NULL);
for(i = 1; i >= 0; i--) {
printf("Before Thread %d create\n", i);
thr_id = pthread_create(&p_thread[i],NULL, t_function, (void *)&arg[i]);
printf("After Thread %d create\n", i);
usleep(1000);
}
int temp[2];
for(i = 1; i >= 0; i--) {
printf("Before Thread %d join\n", i);
pthread_join(p_thread[i], (void**)&status);
printf("After Thread %d join\n", i);
temp[i] = status;
}i
printf("%d%d", temp[1], temp[0]);
pthread_mutex_destroy(&mutex_lock);
return 0;
}
Je ne peux pas reproduire ce, j'ai essayé les 2 et 4 fils. Il fonctionne parfaitement bien, même à l'intérieur de Valgrind. Pouvez-vous nous dire quelque chose d'autre sur le problème?
Avez-vous essayé un débogueur? gdb est votre ami.
Bienvenue DONC. 🙂
Avez-vous essayé un débogueur? gdb est votre ami.
Bienvenue DONC. 🙂
OriginalL'auteur IKS | 2011-11-05
Vous devez vous connecter pour publier un commentaire.
Vous n'alloue de l'espace pour deux éléments ici, donc, si vous lancez plus de 2 threads, vous allez lancer, à la fin du tableau et potentiellement accident ou endommager la pile.
En outre:
status
est unint
, pas unvoid *
; tenter ce sera essayer d'enregistrer unevoid *
dans unint
. Sur de nombreuses plates-formes 64 bits, ce sera aussi le débordement (depuisvoid *
sera de 8 octets alors queint
est de 4). Fairestatus
unvoid *
, et arrêter d'essayer d'éloigner le compilateur erreurs de ce type. Ils sont les erreurs pour une raison.Bon point, mais nous ne pouvons pas expliquer l'erreur de segmentation sur 2 fils.
vous devrez montrer le code où vous avez modifié ces chiffres puis, il est parfaitement possible que vous avez oublié de le modifier. Mieux encore, commencer à utiliser
#define
s ou une variable pour définir le nombre de threads pour lancer, et les deux boucles et le tableau des allocations utilisation de cette variable/macro, pour éviter les incohérences.Je crois que j'ai trouvé pourquoi c'est arrivé... j'ai mis "statut" que "int", mais depuis que je suis en 64 bits à l'aide de la machine, je devrais sans doute mettre le statut "comme" long int " ... peut-être... je ne suis pas parfaitement sûr, mais il résout le problème pour l'instant.
merci pour l'astuce
OriginalL'auteur bdonlan