当我运行以下程序时遇到段错误。我
我正在尝试制作一个执行 100 次的多线程程序:
- 打开文件。
- 读取文件的最后一行(每行包含一个数字)。
- 将数字加 3。
- 在文件末尾附加新号码。
- 关闭文件。 线程数由用户指定。 当我创建 2 个线程时,这段代码运行正确, 但是当我尝试创建 1 或不同于 2 的数字时, 它显示段错误。
我正在使用信号量在线程之间进行同步。 您知道为什么会这样吗?
主要部分:
for(i=0;i<NumberOfThreads;i++) {
if (pthread_create( pid[i], NULL, subthread, NULL ) != 0) {
fprintf(stderr, "pthread_create failed with i = %d. errno = %d, %s\n",i, errno, strerror(errno));
break;
}
}
for(i=0;i<NumberOfThreads;i++) {
pthread_join(*pid[i], NULL);
}
return 0;
}
void *subthread(void) {
int i ;
int temp ;
char ch;
int offset =0 ;
FILE * fd1 ;
FILE * fd2 ;
for(i=0 ;i<100;i++) {
sem_wait(&sem1);
fd1 = fopen (NameOfFile,"r");
fseek (fd1,-2,SEEK_END);
offset=-2;
while((ch=getc(fd1)) !='\n')
{
offset=offset-1;
fseek (fd1,offset,SEEK_END);
}
fscanf(fd1,"%d",&temp);
fclose(fd1);
fd2 = fopen (NameOfFile,"a");
temp=temp+3;
fprintf(fd2,"\n%d",temp);
printf("%d\n",temp);
fclose(fd2);
sem_post(&sem1);
}
pthread_exit(0);
}
这只是一部分代码。
当我运行代码并将 1 个线程作为输入时,它显示了一个段错误。对于 2 个线程,执行是正确的。 对于超过 2 个线程,它再次显示段错误
当我尝试调试以查看导致段错误的原因时,日志显示是 PTHREAD_CREATE
函数导致的。
最佳答案
对于 pthread_create()
,作为第一个参数传递的指针必须指向一个有效位置,pthread_create()
写入线程 ID。
但是正如您在评论中所说,pid
定义为
pthread_t * pid[NumberOfThreads+1];
这是一个指针数组,最初不指向有效位置。根据数组的定义方式,它们可能为 NULL 或未确定。
我建议您将定义更改为
pthread_t pid[NumberOfThreads+1];
并调用 pthread_create(pid+i,....)
或 pthread_create(&pid[i],...);
并使用 pid[ i]
而不是 *pid[i]
用于其他 pthread_...()
调用
关于c - 尝试为文件 IO : 创建多个线程时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56429447/