繁体   English   中英

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

[英]Best way to read/write file in multithreaded environment (C++)

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

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

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

首先,我想知道在每个平台上同时读写文件还是多次读取是否安全。 其次,如果可以的话,我想知道对于HDD来说,像“磁盘读写头”这样的硬件如何安全? 该软件一直在磁盘上工作以保存数据,并且我不希望我的算法减少太多的硬盘寿命(已经很短了)。

谢谢您的帮助

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

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

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

只需读取整数就不会损坏它,即使同时由多个线程完成并由一个线程写入也是如此,因此这将确保您的读取器线程不会超出限制读取,并且该限制始终是安全且一致的,而写程序线程可以在保证完成之前不会被读线程打扰的区域中和平地写入数据。

至于第二个问题,如果您确实能够将当前正在写入的文件完全保留在内存中,那将节省一些HDD的使用以及时间。 此外,请记住,大多数现代HDD具有32Mb +的缓存,因此,除非您有大量线程始终读取随机文件及其随机部分,否则并非每次读写都会直接命中HDD本身。 如果真是这样,您可能无法做很多事情来帮助HDD。 如果不是这种情况,就不必担心太多了,因为操作系统和缓存将按原本打算的方式进行:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM