[英]Segmentation fault 11 thread program
我出现以下代码错误“ Segmentation fault 11”:我创建了一个线程,该线程输入了一个结构。
我认为问题出在函数*MARIT
的声明中。
对不起,我的英语不好,我是法语。
struct parametres {
double *T;
int N; //taille
};
void *MARIT(struct parametres parametres)
{
int *somme =0;
float *moyenne = 0;
int i;
for(i = 0; i < parametres.N; i++)
*somme = *somme + parametres.T[i];
printf("somme : %d",somme);
*moyenne = (*somme/(parametres.N+0.0));
pthread_exit(moyenne);
}`
int main(int argc, char* argv[])
{
float temps;
clock_t t1, t2;
t1 = clock();
struct parametres params;
printf("Salut à toi !\n");
printf("Donnez la taille du tableau :" );
scanf("%d", ¶ms.N);
params.T = malloc( params.N * sizeof(double) );
int i = 0;
int nombre_aleatoire = 0;
for(i=0; i<params.N; i++){
nombre_aleatoire = (rand() % 1000) + 1;
params.T[i]=nombre_aleatoire;
}
pthread_t arith,quadrat,cubi;
if(pthread_create(&arith, NULL, MARIT, (void*)¶ms) != 0)
{
perror("pthread_create");
exit(1);
}
double *result=0;
pthread_join(arith, (void**)&result);
printf("le resultat du thread : %f",result);
return 0;
}
我不知道出什么问题了。
您的代码有两个问题。
首先是MARIT
的签名。 它必须采用一个单一的void*
参数。
其次, somme
和moyenne
被声明为指针,但是您不为它们分配任何内存。 这就是导致段错误的原因。
第三,返回值必须是一个空指针。 这意味着它必须具有指针的大小,并且它指向的值必须在调用后保持不变(在MARIT
返回自动变量的地址是不行的)。
第四, main
希望返回一个双,所以改变moyenne
的类型。
可以通过以下方式解决所有三个问题:
void *MARIT(void *param)
{
struct parametres *parametres = (struct parametres*)param;
int somme =0;
double moyenne = 0, *ret;
int i;
for(i = 0; i < parametres->N; i++)
somme = somme + parametres->T[i];
printf("somme : %d",somme);
moyenne = (somme/(parametres->N+0.0));
ret = malloc(sizeof ret);
*ret = moyenne;
pthread_exit(ret);
}
请注意,当main
函数完成重处理值后,它应该free
它。 在这种情况下,程序立即结束,那么释放内存就没有必要了。
你还需要改变的printf在main
:
printf("le resultat du thread : %f", *result);
int *somme =0;
...
*somme = ... // segmentation fault here
因为您将somme声明为指向未分配内存的指针(而且是NULL指针)。 解决方案: int somme = 0;
易变的moyenne也是如此: float moyenne = 0;
> SYNOPSIS
> #include <pthread.h>
>
> int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
> void *(*start_routine) (void *), void *arg);
您的函数必须具有以下签名
void * start_routine (void *);
错误时刻,几乎所有事物都是不确定的行为。 并且您必须始终为指针分配内存,然后再对它们指向* somme和* moyenne的空间进行崩溃,原因相同。 尽管我完全不知道您选择使用指针而不是普通变量。
void *MARIT(void *arg) // change <--here
{
struct parametres *parametres = (struct parametres *) arg; // change <--here
int *somme = malloc(sizeof(int)); // change <-- here
float *moyenne = malloc(sizeof(float)); // change <-- here
int i;
for(i = 0; i < parametres->N; i++) // change <--here
*somme = *somme + parametres->T[i]; // change <--here
printf("somme : %d",somme);
*moyenne = (*somme/(parametres->N+0.0)); // change <--here
pthread_exit(moyenne);
}`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.