gpt4 book ai didi

c - 使用多线程的字数统计程序: Large file size

转载 作者:行者123 更新时间:2023-11-30 18:41:27 25 4
gpt4 key购买 nike

我正在尝试编写一个程序来计算大文件中的单词数。我正在做多线程。但我的程序给出了段错误,我就卡在这里了。我正在寻求导师的任何建议:代码如下:

输入:文件名输出:段错误

代码是:

   #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'){
//newLine++;
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, x, id, blockSize,len;
//void *state;
FILE *fp;
pthread_t *threads;

struct thread_data data[nthreads];

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);
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;

}
//LAST THREAD
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);
//free(threads);

//pthread_exit(NULL);

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

最佳答案

类型转换并不能修复错误的代码 - 它只会掩盖它或使其变得更加错误。让我们看看这些错误:

struct thread_data* td=(struct thread_data)data; /* wrong */

您不能将 struct thread_data * 转换为 struct thread_data,也不能将 struct thread_data 分配给 结构体thread_data *。不正确的不必要的转换是错误的唯一原因。

x = pthread_create(&threads[id], NULL, &countFrequency, (void *)data); /* wrong */

其次,您也不能将 struct thread_data 转换为 void * - 您需要一个实际的指针,例如 地址>数据:

x = pthread_create(&threads[id], NULL, &countFrequency, &data);

也不需要强制转换,因为指向数据类型的指针自然会转换为 void *。当然,由于只有一份 data 副本,所有线程都将共享它,并且所有工作都基于最后写入的值。这不会很顺利 - 每个线程都需要一个 struct thread_data

第三,这些警告告诉您您的线程函数有错误的签名:

void *countFrequency(struct thread_data *data) /* wrong */

结合第一点,使所有类型正确,并且再次不需要强制转换。

void *countFrequency(void *data) {
struct thread_data* td = data;

关于c - 使用多线程的字数统计程序: Large file size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21355220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com