【问题标题】:c++ Permanent Offline Counterc++永久离线计数器
【发布时间】:2018-10-02 12:39:10
【问题描述】:

我有一个嵌入式服务器,可以随时拔掉电源。有没有一种优雅的方式来实现事务性 c++ 计数器?在最坏的情况下,它应该返回之前的 ID。

我有一个定期生成报告文件的嵌入式服务器。服务器没有时间或网络连接,所以我想增量生成报告文件。但是,下载报告文件后,我想删除报告文件,同时维护计数器:

report00001.txt
report00002.txt
report00003.txt
report00004.txt
// all the files have been deleted
report00005.txt
...

我想使用这样的代码:

 int last = read_current_id("counter.txt");
 last++;
 // transaction begin
 write_id("counter.txt", last);
 // transaction end

【问题讨论】:

  • “我想使用这样的代码”是什么让你不这样做?
  • @Swordfish 大概是担心write_id的原子性...
  • 是的,问题涉及 write_id 的原子性。写ID必须删除'counter.txt'的内容。如果此时拔掉设备会发生什么?

标签: c++ counter transactional


【解决方案1】:

(假设您的服务器正在运行某种 unixy 操作系统)

您可以尝试使用 write-and-rename 习惯用法。

您所做的是将新的计数器值写入另一个文件,例如 counter.txt~,然后将临时文件 rename 写入常规的 counter.txtrename 保证文件的新版本或旧版本将随时存在。

您还应该使用sync 选项挂载您的文件系统,以便文件内容不会缓冲在RAM 中。但请注意,这会降低性能,并可能缩短闪存的使用寿命。

【讨论】:

  • 我喜欢这个主意,谢谢。它是 Linux (buildroot)。
猜你喜欢
  • 2018-06-12
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多