gpt4 book ai didi

c++多个进程写入同一个文件 - 进程间互斥锁?

转载 作者:行者123 更新时间:2023-12-01 14:37:28 24 4
gpt4 key购买 nike

我的问题是:从多个进程写入文件的最佳方式(或至少是一种有效方式)是什么?

注意:我使用的是 c++11,我希望它可以在任何平台上运行(即仅纯 c++ 代码)。

我做了一些研究,这是我得出的结论:

  1. 在我的进程中有多个线程。这可以在每个进程中轻松处理,使用互斥锁来序列化对文件的访问。
  2. 不能使用 c++/c++11 互斥锁或条件变量在进程之间进行序列化。
  3. 我需要某种外部信号量/锁定文件来充当“互斥锁”...但我不确定如何着手这样做。

我见过应用程序在使用时使用诸如创建“.lock”文件之类的东西。但是对于多个快速访问,这似乎不起作用(即在一个进程确定文件不存在后,另一个进程可以创建它,然后第一个进程也将尝试创建它)因为测试和创建文件的操作是不是原子的。

注意:每个进程总是一次写入一整行。我原以为这可能足以使操作“原子化”(因为整行会在下一行之前得到缓冲),但情况似乎并非如此(除非我的代码有误)因为我(很少)得到一条损坏的线。这是我如何进行写入的代码片段(如果相关):

// in c'tor
m_osFile.open("test.txt", std::fstream::out | std::fstream::app)

// in write func (std::string data)
osFile << data<< std::endl;

这一定是一个常见问题,但我还没有找到可行的解决方案。欢迎任何代码片段。

最佳答案

My question is this: what is the best way (or at least an effective way) to write to a file from multiple processes?

最好的方法是......不要这样做!

这真的像是一种日志(附加)。我会让每个进程编写自己的文件,然后在需要时合并它们。这至少是通用方法,这就是基本原理。

任何类型的进程内锁定都不会起作用。打开的文件在操作系统级别有缓冲,即使在某些操作系统 (windows) 上关闭后也是如此。

如果你想要一个可移植的解决方案(“我希望它在任何平台上运行”),你不能执行文件锁定:你将遇到甚至可能的性能损失/未定义的行为,具体取决于所使用的文件系统(例如:samba , NFS).

在今天,并发且可靠地写入单个文件实际上是一项依赖于系统的事件。

我并不是说这不可能 - 数据库引擎和其他应用程序可靠地执行此操作,但这是一个自定义操作。

作为一个很好的替代方案,您可以让一个进程充当收集器(如 Gem Taylor 所提议的那样),所有其他进程充当生产者,但这不是一个可靠的替代方案:日志需要“简单地”到达磁盘":如果一个bug可以让日志写不出来,那么日志的目的就失去了。

然而,您可以考虑使用这种方法,将进程解耦并让它们之间的消息可靠高效地交换:如果是这种情况,您可以考虑使用像 RabbitMQ 这样的消息传递解决方案。 .

在这种情况下,所有进程都将它们的“行”发布到消息代理,并且另一个进程使用这些消息并将它们写入文件。

关于c++多个进程写入同一个文件 - 进程间互斥锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49381583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com