簡體   English   中英

嘗試為文件IO創建多個線程時出現分段錯誤:

[英]Segmentation fault when trying to create multiple threads for file IO:

我運行以下程序時遇到分段錯誤。 一世
我正在嘗試制作一個執行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()寫入thre線程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_...()調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM