c++ - 在 MacOSX 上,在 C++ 程序中,我对文件 IO 有什么保证

标签 c++ multithreading macos file logging

我在 MacOSX 上。 我正在编写一个多线程程序。 一个线程进行日志记录。 非日志线程可能随时崩溃。

我应该在记录器中采用什么约定/我可以有什么保证?

我更喜欢这样一种解决方案,即使我在部分写入过程中崩溃,之前的写入仍然会转到磁盘,并且在回读日志时,我可以弄清楚“啊,我写了 100 个完整的实体,然后我崩溃了第 101 个。

谢谢!

最佳答案

我在 Linux 上编程,而不是 MacOSX,但那里可能是一样的。

如果你的程序日志中只有一个线程,这意味着你在这个日志线程中缓冲日志数据,然后它把它写入一个文件可能是一个更大的部分以避免太多的 I/O 操作并使日志过程更快.

不好的是,如果一个线程出现段错误,整个进程连同缓冲数据一起被销毁。

我知道的解决方案(适用于 Linux)是:

  1. 通过套接字传输日志数据,而不使用缓冲日志线程(例如 syslog)。在这种情况下,操作系统可能会处理写入套接字的数据,即使您的应用程序崩溃,数据也应该在另一端接收并成功记录。

  2. Don 使用日志记录线程,每个线程都可以同步记录到文件中。在这种情况下,崩溃后日志数据的损失应该很小或没有。虽然速度较慢。

我还不知道这个问题的更好解决方案,不过学习一些会很有趣。

关于c++ - 在 MacOSX 上,在 C++ 程序中,我对文件 IO 有什么保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2431434/

相关文章:

java - 如何在 OSX 上从 Java 访问网络路径?

c++ - 如何将多个纹理应用于立方体的 VBO?

c++ - 将CMake构建的库链接到预构建的目标文件

c++ - 当指针超出范围时,CComObject::CreateInstance 创建的 COM 对象不会被销毁

multithreading - 为什么自旋锁会成为多线程程序中的性能问题?

objective-c - NSPredicateEditor 正在清除其 NSTextField 的值

macos - 英国 mac 终端中的 Meta 和 #

c++ - 无法加载共享库 : libxerces. 所以

ios - RestKit 完成 block 是否在主 UI 线程上运行?

c# - 如何创建一个一次只能从一个线程执行的异步方法?