0

我有一个读取和写入文件的多线程程序。一个线程接收数据并将它们写入文件。每 250 Mb 的数据,就会创建一个新文件。多个其他线程可以读入这些文件以检索数据。我正在使用 C++ 标准文件流。

为了防止出现问题,我当前的实现对同一个文件使用了两个文件描述符:一个用于读取器,一个用于写入器。互斥锁同时防止多个访问,并且每次互斥锁所有者需要时移动文件描述符位置。

我真的需要能够尽可能快地读取文件,而互斥锁并没有真正帮助我。

首先,我想知道读取和写入文件是否安全或同时进行多次读取(在每个平台上)。其次,如果是,我想知道它对硬盘的“磁盘读写头”等硬件的安全性如何。该软件一直在磁盘上工作以保存数据,我不希望我的算法过多地减少硬盘寿命(已经很短)。

谢谢您的帮助

4

1 回答 1

1

多个线程读取同一个文件没有问题。

现在,如果我正确理解了您的描述,您不会修改已经写入的数据,您只需不断地将数据附加到文件中,直到达到 250Mb,然后您继续写入新文件。

如果是这种情况,您可能根本不需要互斥锁。例如,您可以将整个“文件”保存到内存中,直到达到 250mb,然后才将其全部写入磁盘,这样您就知道磁盘上已经存在的任何文件都不会再被写入了,并且可以无忧无虑地自由阅读。至于仍在写入的文件,您可以拥有一个全局整数来保存已写入的字节数(或字符串或您使用的任何内容),并且读取线程受此整数限制,不需要锁,只要您在已经写入数据后才更新整数。(因为你说只有1个线程写入数据)。

即使由多个线程同时完成并由单个线程写入,简单地读取整数也不会损坏它,因此这将确保您的读取器线程不会读取超出限制,并且这样的限制将始终是安全且一致的,而写线程可以在一个保证不会被读线程打扰的区域中安静地写入数据,直到它完成。

至于您的第二个问题,如果您确实能够将当前正在写入的文件完全保存在内存中,那已经节省了一些 HDD 使用量以及时间。此外,请记住,大多数现代 HDD 都有 32Mb+ 的缓存,因此并不是每次读写都会直接命中 HDD 本身,除非您有大量线程一直在读取随机文件和其中的随机部分。如果是这种情况,您可能无能为力来帮助 HDD。如果不是这种情况,那就不用担心了,因为操作系统和缓存会做它们应该做的事情:)

于 2013-06-21T15:08:00.783 回答