2

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

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

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

我目前唯一的想法是有 2 个线程,一个在开头,一个在结尾,从相反的两端读取,每次他们点击换行符时,他们都会将其散列到我的表中。显然,从最后开始的人首先需要翻转字符串。

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

4

1 回答 1

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 调用置于循环中,因为不能保证操作系统将在单个调用中返回所有字节。

int lastlen=0;
int len;
while((len = fread(buff+lastlen, 1, size-lastlen-1, f)) > 0) {
    lastlen+=len;
}
于 2013-10-26T00:50:30.533 回答