我有一个多线程C++ 11程序,其中每个线程产生大量需要写入磁盘的数据。所有数据都需要写入一个文件。目前,我使用了一个互斥锁,该互斥锁可以保护从多个线程对文件的访问。我的 friend 建议我可以为每个线程使用一个文件,最后使用cat从C++代码完成的system()命令将文件合并为一个文件。
我在想cat命令是否将从磁盘读取所有数据,然后再次将其写入磁盘,但是这次将其写入单个文件,不会有任何改善。我已经用谷歌搜索,但是找不到cat命令的实现细节。我可以知道它是如何工作的,是否可以加速整个过程?

编辑:
事件的时间顺序并不重要,并且文件内容没有排序约束。两种方法都会执行我想要的。

最佳答案

您没有指定对文件内容是否有排序或结构约束。通常情况是这样,所以我会这样处理,但希望我的解决方案能以任何一种方式工作。

经典的编程方法

这个想法是将写入磁盘的工作转移到专用的IO线程,并且有多个生产者/一个使用者队列来排队所有写入命令。每个工作线程只需将其输出格式化为字符串并将其推回队列即可。 IO线程将一批消息从队列中弹出到缓冲区中,并发出写入命令。

或者,您可以在消息中添加一个字段,以指示哪个工作程序发出了写命令,并在需要时将IO线程推送到其他文件。

为了获得更好的性能,如果您的主机操作系统支持IO系统原语的异步版本(读/写),则也很有趣。然后,IO线程将能够监视多个并发IO,并在一个线程终止时向其提供新的IO。

正如评论中所建议的那样,您将必须监视IO线程以了解拥塞情况,并相应地调整工作程序的数量。基于“自然”反馈的机制只是简单地使队列有界,工作人员将等待锁,直到其上的空间释放为止。这样,您就可以在过程生命周期中的任何时候控制生产的数据量,这在内存受限的情况下很重要。

您的cat有关

至于catthis command line tool只需读取写入其输入通道的内容(通常为stdin),然后将其复制到其输出(stdout)。就这么简单,您可以清楚地看到与上面提倡的解决方案的相似之处。区别在于cat不了解文件内部结构(如果有),它仅处理字节流,这意味着,如果多个进程在不同步的情况下同时写入cat输入,则结果可能会完全混淆。另一个问题是IO原语的atomicity(或其缺少)。

注意:在某些系统上,有一个名为fork的简洁小功能,它使您可以将多个“独立”数据流复用到一个文件中。如果碰巧在支持该功能的平台上工作,则可以将所有数据流 bundle 在一个文件中,但可以分别访问。

08-06 01:04