2012-10-13 36 views
0

我想用pthread库创建线程。汇编没问题, gcc -o -pthread file file.c运行时错误 - POSIX线程

但是当我运行代码时,出现了段错误。我不确定问题是什么。我试图执行教科书中给出的代码来尝试学习,但现在我迷失了方向。谁能帮忙?代码如下...非常基本,是的,但请把我赶出去。

#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); 
} 
+0

这可能是值得学习如何使用调试器。在linux上''gdb'将是选择的工具。在使用'gdb'后,你会在短时间内很轻松地发现这个错误。 – alk

+0

此外,使用选项'-Wall'打开所有警告是一个好主意。在您的特定情况下,编译器将打印的警告将直接指向您的关键代码行。试试吧.. ;-) – alk

回答

1

您弄丢了支架:

变化:

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

到:

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

非常感谢!我觉得这是非常愚蠢的......调试器能帮助我识别所有这样的小事情吗? – plaknas

+0

是的,他们可以帮助您确定哪些线路会给您段错误:) –

3

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

你不包括stdlib.h,所以atoi是未申报的,和你不return荷兰国际集团从runner什么,但你已经宣布它为返回void*

但主要问题是这一行:

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

argv[1] < 0将评估为01,这是不是你想要作为参数传递给atoi什么。你想要的是:

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

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