在日志文件中线程化写入

时间:2011-07-23 22:43:43

标签: c++ multithreading optimization file-io

我正在为我的(2d)游戏引擎设置日志系统,它应该能够将行写入文件。

关键是,写入光盘不是即时的。如果文件写入(基本上是file.flush())是在调用Trace.Write()的线程中完成的,它会在写入文件时挂起吗?

如果是这种情况,那么创建一个仅用于将日志行写入日志文件的线程会很有趣,而处理线程将继续它正在做的事情。

与控制台相同的问题(我在这里......)。

问题是:

“在计算密集型程序中,为控制台和/或文件写入线程是否有趣?”

谢谢。

3 个答案:

答案 0 :(得分:2)

是的,您的线程可能在处于IOWAIT状态时被挂起。这是一种经典的暂停情况。

如果创建一个只负责编写日志文件条目的线程,这取决于你的代码。它是I / O绑定的吗?那么这可能是一个好主意。你的代码是CPU绑定的吗?然后它没有多大帮助。不是吗?然后没关系。

解决这个问题的最佳方法是分析您的代码并对两个版本进行基准测试。

答案 1 :(得分:1)

如果排队日志写入专用日志记录线程,则有许多优点。最大的缺点是,当您的日志调用返回时,几乎肯定不会发生日志记录。如果您想要捕获的问题是灾难性的崩溃,那么识别该错误的日志条目可能根本不会被写入。

在计算密集型程序中,为控制台和/或文件编写线程是否有趣?

总的来说,考虑到上面的警告,可能是的:

See also:

答案 2 :(得分:1)

  

如果文件写入(基本上是file.flush())是在调用Trace.Write()的线程中完成的,它会在写入文件时挂起吗?

是。这是因为flush()调用旨在确保数据到达磁盘。

  

如果是这种情况,那么创建一个仅用于将日志行写入日志文件的线程会很有趣,而处理线程将继续它正在做的事情。

为什么不停止调用flush()?如果你没有兴趣确保程序的某个部分,到目前为止所写的所有数据都在磁盘上,只需要手动停止调用flush(),它就会被缓冲并写入通常有效的方式。

最终,如果磁盘写入系统需要定期同步挂起线程(我不确定是这种情况),那么将日志写入另一个线程可能会有一些小好处,但我希望你输了远远超过你必须实现同步,但是你将可记录的字符串传递给后台线程。然后你开始想知道你是否可以使用无锁队列或其他复杂的系统,当你真正需要以一种简单的方式做到这一点时 - 只要你喜欢就写,只有在绝对必要的情况下才能刷新。