我编写了一个程序来创建10个线程并正常运行它们。该程序运行正常,但最后它给出了分段错误。这是什么错,造成它的原因是什么,我该如何解决? 我的代码是:
#include<stdio.h>
#include<pthread.h>
void *print(void *num);
int main()
{
pthread_t tid[10];
int n,check;
void *exitstatus;
for(n=1;n<=10;n++)
{
check=pthread_create(&tid[n],NULL,print,(void *)&n);
if(check=0)
printf("thread created");
pthread_join(tid[n],&exitstatus);
}
return 0;
}
void *print(void *num)
{
int i,*val=(int *)num;
for(i=0;i<(5);i++)
printf("Hello World!!!(thread %d )\n",*val);
}
答案 0 :(得分:7)
你有很多缺陷:
for(n=1;n<=10;n++) // No, The array starts from 0 and lasts on 9
试试这个
for(n=0;n<10;n++)
if(check=0) // No, this will assign 0 to check instead of compare it
试试这个
if(check==0)
答案 1 :(得分:3)
您正在访问索引之外的数组。这是未定义的行为。
您的数组t[10]
从索引t[0]
开始,应该以{{1}}结尾 -
t[9]
同样for(n = 0; n < 10; n++) {
//your stuff
}
是你检查平等的方法。 check == 0
会将check = 0
分配给0
所以你的代码必须如下所示:
check
关于编程风格的另一个重要注意事项:请使用适当的缩进并明智地使用空格。如果使用适当的缩进和空格,则可以消除大多数编程错误和错误。例如,在#include<stdio.h>
#include<pthread.h>
void *print(void *num);
int main()
{
pthread_t tid[10];
int n,check;
void *exitstatus;
for(n = 0; n < 10; n++)
{
check=pthread_create(&tid[n], NULL, print, (void *)&n);
if(check == 0)
printf("thread created");
pthread_join(tid[n], &exitstatus);
}
return 0;
}
void *print(void *num)
{
int i,*val=(int *)num;
for(i = 0; i < 5; i++)
printf("Hello World!!!(thread %d )\n", *val);
}
循环中的运算符之前和之后的一个空格,以及在for
之后和下一个参数之前调用函数时的参数之间。