共享资源==争用
根据定义写入普通文件是序列化操作。通过尝试从多个线程进行写入无法获得任何性能,I / O是有限的有限资源,其带宽甚至比最慢或最重载的CPU还要小几个数量级。
并发访问共享资源可能很复杂(并且速度很慢)
如果您有多个线程正在执行昂贵的计算,那么您可以选择,如果您只是因为考虑到要加快某些速度而仅使用多个线程,那么您将采取相反的做法。I /
O争用总是会减慢对资源的访问,而由于锁等待和其他开销,它永远不会加快对资源的访问。
您必须有一个受保护的关键部分,并且一次只允许一个编写者。只需查找任何支持并发的日志记录编写器的源代码,您就会看到只有一个线程可以写入文件。
如果您的应用程序主要是:
CPU绑定: 您可以使用某种锁定机制/数据构造,一次只允许多个线程中的一个线程写入文件,从并发的角度来看,这是天真的解决方案;如果这些线程受CPU约束,但I / O很少,则可能会起作用。
I / O绑定: 这是最常见的情况,您必须使用带有某种队列的消息传递系统,并将所有线程发布到队列/缓冲区,并从中提取单个线程并写入文件。这将是最具扩展性和最容易实现的解决方案。
日记-异步写入
如果您需要创建一个单个的超大文件,而该文件的写入顺序并不重要,并且该程序受CPU限制,则可以使用日记技术。
让每个
process文件都写入一个单独的文件,然后将多个文件最后合并为一个大文件。这是一个非常古老的 低技术含量的
解决方案,效果很好,并且已经使用了数十年。
显然,您拥有的存储I / O越多,它将在最终连接上执行得越好。



