首页 > 解决方案 > c++永久离线计数器

问题描述

我有一个嵌入式服务器,可以随时拔掉。有没有一种优雅的方式来实现事务性 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

标签: c++countertransactional

解决方案


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

您可以尝试为此使用 write-and-rename 习语。

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

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


推荐阅读