线程不适合这类问题。由于您必须使用同步代码,它们甚至可能会降低性能。如果您最小化读取操作,您将获得更好的性能。例如,您可以通过一次读取读取内存中的整个字典,然后在内存中处理它。
FILE *f= fopen("/usr/share/dict/linux.words","r");
// find the file size
fseek(f, 0, SEEK_END);
int size = ftell(f);
rewind(f);
// Allocate buffer and read the entire file in a single read.
char buff[size];
if (f) {
int len = fread(buff, 1, size, f);
buff[len]='\0';
fclose(f);
}
// Process the file (assuming entries are separated by newlines)
char *token = strtok(buff, "\n");
for (; token; token = strtok(NULL, "\n"))
printf ("%s\n", token);
为简单起见,我在上面的代码中使用了单个 fread,但是为了安全起见,您必须将 fread 调用置于循环中,因为不能保证操作系统将在单个调用中返回所有字节。
int lastlen=0;
int len;
while((len = fread(buff+lastlen, 1, size-lastlen-1, f)) > 0) {
lastlen+=len;
}