我正在尝试使用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);
}
答案 0 :(得分:3)
请打开并仔细检查编译器的警告。
您未包含stdlib.h
,因此atoi
未声明,并且您return
未runner
,但您已将其声明为返回void*
。
但主要问题是这一行:
if (atoi(argv[1] < 0))
argv[1] < 0
将评估为0
或1
,这不是您想要的atoi
参数。你想要的是:
if (atoi(argv[1]) < 0)
如果启用了正确的警告,你的编译器很可能会指出所有这些问题。
答案 1 :(得分:1)
您错放了括号:
更改:
if (atoi(argv[1] < 0))
到:
if (atoi(argv[1]) < 0)