0

我正在尝试使用 pthread 库创建线程。使用 gcc -o -pthread file file.c 编译很好

但是当我运行代码时,我遇到了分段错误。我不确定问题是什么。我试图执行教科书中给出的代码来尝试学习,但我现在迷路了。任何人都可以帮忙吗?代码如下...非常基本,是的,但请帮帮我。

#include<stdio.h>
#include<pthread.h>

int sum;
void *runner(void *param);

int main (int argc, char *argv[])
{
    pthread_t tid;
    pthread_attr_t attr;
    //printf("Am I here..?\n");
    if (argc!=2)
    {
        fprintf(stderr, "usage: a.out ...\n");
        return -1;
    }

    if (atoi(argv[1] < 0))
    {
        fprintf(stderr, "%d must be >= 0\n", atoi(argv[1]));
        return -1;
    }



    pthread_attr_init(&attr);
    pthread_create(&tid, &attr, runner, argv[1]);
    pthread_join(tid, NULL);

    printf("sum = %d\n", sum);
}

void *runner(void *param)
{
    extern int sum;
    int i, upper=atoi(param);
    sum=0;

    for(i=1; i<= upper; i++)
        sum+=i;

    pthread_exit(0);
}
4

2 回答 2

3

请打开并仔细检查编译器的警告。

你不包括stdlib.h,所以atoi是未声明的,并且你没有return从任何东西中获取任何东西,runner但你已经将它声明为返回 a void*

但主要问题是这一行:

if (atoi(argv[1] < 0))

argv[1] < 0将评估为0or 1,这不是您想要作为atoi. 你想要的是:

if (atoi(argv[1]) < 0)

如果启用了正确的警告,您的编译器很可能会指出所有这些问题。

于 2012-10-13T09:47:21.943 回答
1

您放错了支架:

改变:

if (atoi(argv[1] < 0))

至:

if (atoi(argv[1]) < 0)
于 2012-10-13T09:46:45.080 回答