【问题标题】:Cross-platform atomic writes/renames without a transactional FS in C++在 C++ 中没有事务性 FS 的跨平台原子写入/重命名
【发布时间】:2015-04-27 13:24:09
【问题描述】:

我正在开发需要确保其保存到磁盘的数据的一致性的应用。我需要保证数据在转储到磁盘时永远不会损坏。 IE。保存数据时可能会发生重启或应用关闭。

我知道需要完成的步骤: http://blogs.msdn.com/b/adioltean/archive/2005/12/28/507866.aspx

但我想知道是否已经有一个实现允许最好以跨平台的方式实现这一点?我认为 boost::filesystem 保证原子重命名(在 Windows 和 POSIX 上),所以想知道我是否在某处的 boost 中错过了这个功能?谢谢

UPD:我希望 boost::interprocess::message_queue 但是如果进程在添加到队列的过程中被杀死 + 内存映射文件占用磁盘上的最大大小,它只会挂起读取队列无论如何,预计会是最坏的情况。

【问题讨论】:

  • 您不能只使用支持事务的 sql 数据库,还是出于某种原因需要在自己的文件中使用它?数据库供应商已经花费了很多精力来保证这种事情。还是你想知道他们使用的算法?
  • @rlb:我不希望仅仅为了序列化非常简单的数据结构而引入额外的依赖。此外,我需要有关损坏的数据条目的信息(即可用于恢复)。因此,我可以看到如何实现这一点(请参阅我帖子中的链接)。用 SQL 观察数据库一致性似乎不是一件容易的事,因为关于损坏条目的简单报告是不够的。

标签: c++ boost filesystems cross-platform transactional


【解决方案1】:

如果您使用重命名,您可能会降低性能和/或丢失所有应用数据。可能是在每条记录之后存储一些关键信息(例如记录ID和指纹),并在应用程序启动时寻找最后一个正确的关键信息是更好的方法吗?

【讨论】:

  • 我知道这一点,但数据的一致性更为重要。我正在考虑将我的条目与 MD5 一起保存在一个单独的文件中,所以如果我丢失了某些东西,它只是数据的一部分或最后写入的记录(即尝试采用一种更精细的方法,将数据保存在“块”中)。但我希望它已经被某人实施/测试过,因为这似乎不是一个非常奇特的问题。
猜你喜欢
  • 2011-01-04
  • 2011-02-20
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多