在多线程环境中读/写文件的最佳方法(C ++)

时间:2013-06-21 14:32:04

标签: c++ multithreading file-io

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

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

我真的需要能够尽快读取文件,并且互斥锁对我没有帮助。

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

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

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

现在,如果我正确理解您的描述,您不会修改已编写的数据,您只需数据追加到您的文件中,直到达到250Mb,然后您继续写一个新文件。

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

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

关于你的第二个问题,如果你确实能够将当前正在编写的文件完全保留在内存中,那么这将节省一些硬盘使用量以及时间。另外,请记住,大多数现代硬盘驱动器都有32Mb +的缓存,所以它并不像每次读写都会直接击中硬盘本身,除非你有大量的线程一直读取随机文件和随机部分。如果是这种情况,可能无法帮助硬盘驱动器。如果情况并非如此,那就没什么可担心的了,因为操作系统和缓存会做他们想要做的事情:)