1

我编写了一个程序来创建 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);
}
4

2 回答 2

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)
于 2013-03-21T12:44:57.033 回答
3

您正在访问超出其索引的数组。这是未定义的行为。

你的数组t[10]从索引开始t[0],应该在t[9]-

for(n = 0; n < 10; n++) { 
 //your stuff
}

也是check == 0你检查平等的方式。check = 0将分配0check

因此,您的代码必须如下所示:

#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调用函数时的参数之间。,

于 2013-03-21T12:49:50.603 回答