gpt4 book ai didi

c++ - 同时写入文件

转载 作者:可可西里 更新时间:2023-11-01 10:10:07 25 4
gpt4 key购买 nike

我有这个工具,其中一个类似日志的文件被多个进程写入。

我想要实现的是在第一次打开文件时将其截断,然后在最后由打开它的几个进程完成所有写入。所有写入都系统地刷新并受互斥锁保护,这样我就不会得到困惑的输出。

首先,一个进程创建文件,然后启动一系列其他进程,一次一个,然后打开文件并写入文件(主进程有时会加入额外的内容;从进程可能会也可能不会保持开放并写点东西)。

我希望尽可能不要使用比已经存在的更多的 IPC(我现在所做的就是写入一个 popen 创建的管道)。除了 CRT 和 Win32 API,我无法访问外部库,并且我不想开始编写序列化代码。

这里是一些代码,显示我去了哪里:

// open the file. Truncate it if we're the 'master', append to it if we're a 'slave'
std::ofstream blah(filename, ios::out | (isClient ? ios:app : 0));

// do stuff...

// write stuff
myMutex.acquire();
blah << "stuff to write" << std::flush;
myMutex.release();

好吧,这是行不通的:尽管从属进程的输出按预期排序,但主进程写入的内容要么聚集在一起,要么在错误的位置,即使它存在。

我有两个问题:提供给 ofstream 的构造函数的标志组合是否正确?无论如何,我走的路对吗?

最佳答案

如果您要从多个线程向日志写入大量数据,您将需要重新考虑设计,因为所有线程都会在尝试获取互斥量时阻塞,并且通常您不希望您的线程被阻止工作,因此他们可以记录。在这种情况下,您需要编写工作线程来将条目记录到队列中(这只需要在内存中移动内容),并有一个专用线程将条目从队列中拉出并将它们写入输出。这样你的工作线程就会被阻塞尽可能短的时间。

您可以通过使用异步 I/O 做得比这更好,但这会变得有点棘手。

关于c++ - 同时写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1915704/

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