如何以线程友好的方式阅读文本文件(字典)

时间:2013-10-25 16:40:57

标签: c linux multithreading dictionary

我在计算机科学课上,我们负责在C中制作哈希表并从dictionary.txt文件中填充它。我和我的一个朋友对我们程序的成绩/表现有一点竞争力,所以我们问是否可以使用线程。 100%新线程,但我知道足够实现一个并注意竞争条件。

我的问题是我想尽快读取文件,这意味着线程。我无法决定如何将其拆分为线程友好的块而不会损坏文件的完整性。

我不能把它分解成字节,因为我们所知道的是字典中的字符串不超过50个字符。

我目前唯一的想法是拥有2个主题,一个在开始时,一个在结尾处从相反的两端读取,每次他们点击换行符时都会将其哈希到我的表中。显然,从头开始的那个首先需要翻转字符串。

我们正在Linux服务器上使用gcc进行编译,如果这有帮助的话。

1 个答案:

答案 0 :(得分:3)

线程不适合此类问题。由于您必须使用同步代码,它们甚至可能会降低性能。如果最小化读取操作,您将获得更好的性能。例如,您可以通过一次读取读取内存中的整个字典,然后在内存中处理它。

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调用放在一个循环中,因为不能保证操作系统会在一次调用中返回所有字节。 / p>

int lastlen=0;
int len;
while((len = fread(buff+lastlen, 1, size-lastlen-1, f)) > 0) {
    lastlen+=len;
}