c - 尝试为文件 IO : 创建多个线程时出现段错误

标签 c multithreading file-io operating-system semaphore

当我运行以下程序时遇到段错误。我
我正在尝试制作一个执行 100 次的多线程程序:

  1. 打开文件。
  2. 读取文件的最后一行(每行包含一个数字)。
  3. 将数字加 3。
  4. 在文件末尾附加新号码。
  5. 关闭文件。 线程数由用户指定。 当我创建 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/

相关文章:

c - 如何在C中读取输入文件并将整数存储到数组中

c# - 如何在 C# 中刷新()?

c - C 中奇怪的输出日历

复共轭转置matlab到C

c - 枚举宏的效用

c++ - CPP std::thread 尝试使用已删除的函数

javascript - 如何使用 onClick 写入文本文件?

c - 如何使用 execlp 将命令行参数传递给 C 程序

Android如何实现从runnable执行异步任务

c - 使用互斥量时 stdout 中没有输出