线程化日志文件中的写入操作
Threading the writing in a log file
我正在为我的(2d)游戏引擎设置一个日志系统,它应该能够将行写入文件。
关键是,写入磁盘不是瞬间的。如果文件写入(基本上是file.flush())是在调用Trace.Write()的线程中完成的,那么在写入文件时它会挂起吗?
如果是这种情况,那么创建一个只用于将日志行写入日志文件的线程将会很有趣,而处理线程将继续它正在做的事情。
同样的问题与控制台(当我在这里…)。
问题是:
"在计算密集型程序中,线程化控制台和/或文件写入是否有趣?"
谢谢。
是的,当线程处于IOWAIT状态时,它可能被挂起。这是一个典型的挂起情况。
创建一个只负责编写日志文件条目的线程是否是个好主意取决于你的代码。是I/O绑定吗?那也许是个好主意。您的代码受CPU限制吗?那就没什么用了。都不是吗?那就无所谓了。
最好的方法是分析代码并对两个版本进行基准测试。
如果将日志写入队列分配给专用的日志线程,那么有许多优点。最大的缺点是,当日志调用返回时,日志记录几乎肯定不会发生。如果您试图捕获的问题是一个灾难性的崩溃,那么标识该错误的日志条目可能根本不会被写入。
在计算密集型程序中,线程化控制台和/或文件写入是否有趣?
总的来说,考虑到上面的警告,可能是:
参见:
如果文件写入(基本上是file.flush())是在调用Trace.Write()的线程中完成的,当文件被写入时,它会挂起吗?
是的。这是因为flush()调用的目的是确保数据到达磁盘。
如果是这种情况,那么创建一个只用于将日志行写入日志文件的线程将会很有趣,而处理线程将继续它正在做的事情。
为什么不停止调用flush()?如果你不想确保在程序的某个部分,到目前为止写入的所有数据都在磁盘上,只要停止手动调用flush(),它将被缓冲并以通常有效的方式写入。
如果磁盘写入系统需要挂起线程的周期性同步(我不确定是这种情况),那么在另一个线程中写入日志可能会有一些小好处,但我希望通过将可记录字符串传递给后台线程来实现同步,您失去的远远超过您获得的。然后,您开始考虑是否可以使用无锁队列或其他一些复杂的系统,而实际上您最初可能只是需要以简单的方式进行操作——随时写入,只有在绝对必要时才刷新。
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 为什么Boost日志记录器操作不是常量
- 如何使线程安全 支持"<<"操作的日志类?
- 线程化日志文件中的写入操作
- C/ c++最快的cmath日志操作
- 为数据密集型操作创建日志