线程化日志文件中的写入操作

Threading the writing in a log file

本文关键字:操作 日志 文件 线程      更新时间:2023-10-16

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

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

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

同样的问题与控制台(当我在这里…)。

问题是:

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

谢谢。

是的,当线程处于IOWAIT状态时,它可能被挂起。这是一个典型的挂起情况。

创建一个只负责编写日志文件条目的线程是否是个好主意取决于你的代码。是I/O绑定吗?那也许是个好主意。您的代码受CPU限制吗?那就没什么用了。都不是吗?那就无所谓了。

最好的方法是分析代码并对两个版本进行基准测试。

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

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

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

参见:

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

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

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

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

如果磁盘写入系统需要挂起线程的周期性同步(我不确定是这种情况),那么在另一个线程中写入日志可能会有一些小好处,但我希望通过将可记录字符串传递给后台线程来实现同步,您失去的远远超过您获得的。然后,您开始考虑是否可以使用无锁队列或其他一些复杂的系统,而实际上您最初可能只是需要以简单的方式进行操作——随时写入,只有在绝对必要时才刷新。