C多线程字数

时间:2016-03-11 01:41:34

标签: c multithreading segmentation-fault pthreads word-count

所以我正在研究c中的多线程字数统计程序,我的代码遇到了一些问题,而在这里搜索我发现了一个与我自己的项目类似的旧问题。我没有尝试重新编写充满问题的代码,而是决定让另一个工作,然后修改它以制作我想要的东西。 该代码将txt文件作为输入。问题是当你运行程序时出现分段错误。 这是代码:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>


struct thread_data{
    FILE *fp;
    long int offset;
    int start;
    int blockSize;
};

int words=0;  

void *countFrequency(void* data){

    struct thread_data* td=data;
    char *buffer = malloc(td->blockSize);

    int i,c;
    i=0;c=0;
    enum states { WHITESPACE, WORD };
    int state = WHITESPACE;

    fseek(td->fp, td->offset, td->start);

    char last = ' '; 
    while ((fread(buffer, td->blockSize, 1, td->fp))==1){

        if ( buffer[0]== ' ' || buffer[0] == '\t'  ){
        state = WHITESPACE;
        }
        else if (buffer[0]=='\n'){
            state = WHITESPACE;
        }
        else {
            if ( state == WHITESPACE ){
                words++;
            }
            state = WORD;
        }
        last = buffer[0];
    }
    free(buffer);

    pthread_exit(NULL);

    return NULL;
}

int main(int argc, char **argv){

    int nthreads, id, blockSize,len;
    FILE *fp;
    pthread_t *threads;


    if (argc < 2){
        fprintf(stderr, "Usage: ./a.out <file_path>");
        exit(-1);
    }

    if((fp=fopen(argv[1],"r"))==NULL){
        printf("Error opening file");
        exit(-1);
    }  

    printf("Enter the number of threads: ");
    scanf("%d",&nthreads);
    struct thread_data data[nthreads];
    threads = malloc(nthreads*sizeof(pthread_t));

    fseek(fp, 0, SEEK_END);
    len = ftell(fp);  
    printf("len= %d\n",len);

    blockSize=(len+nthreads-1)/nthreads;
    printf("size= %d\n",blockSize);

    for(id = 0; id < nthreads; id++){

        data[id].fp=fp;
        data[id].offset = blockSize;
        data[id].start = id*blockSize+1;

    }

    data[nthreads-1].start=(nthreads-1)*blockSize+1;

    for(id = 0; id < nthreads; id++)
        pthread_create(&threads[id], NULL, &countFrequency,&data[id]);

    for(id = 0; id < nthreads; id++)
        pthread_join(threads[id],NULL);

    fclose(fp);

    printf("%d\n",words); 
    return 0;  
}

以下是原帖的链接:original

1 个答案:

答案 0 :(得分:0)

您使用nthreads中具有自动存储时间struct thread_data data[nthreads];的uninitalized变量的不确定值来调用未定义的行为

尝试在scanf("%d",&nthreads);之后移动该行。