运行时错误 - POSIX线程

时间:2012-10-13 09:37:11

标签: c multithreading posix

我正在尝试使用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);
}

2 个答案:

答案 0 :(得分:3)

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

您未包含stdlib.h,因此atoi未声明,并且您returnrunner,但您已将其声明为返回void*

但主要问题是这一行:

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

argv[1] < 0将评估为01,这不是您想要的atoi参数。你想要的是:

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

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

答案 1 :(得分:1)

您错放了括号:

更改:

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

到:

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