4

我正在开发一个用 C++ 编写的多线程应用程序。我使用一些临时文件在我的线程之间传递数据。一个线程将要处理的数据写入目录中的文件。另一个线程扫描目录中的工作文件并读取文件并进一步处理它们,然后删除这些文件。我必须使用这些文件,因为如果我的应用程序在什么时候被杀死,我必须保留尚未处理的数据。

但我讨厌使用多个文件。我只想使用一个文件。一个线程连续写入文件,另一个线程读取数据并删除已读取的数据。就像从顶部和底部填充容器一样,我可以从容器中获取和删除数据。如何在 C++ 中有效地做到这一点,首先有没有办法..?

4

3 回答 3

3

正如对您的问题的评论中所建议的那样,使用 SQLite 之类的数据库可能是一个非常好的解决方案。但是,如果您坚持使用文件,那么这当然是可能的。

我自己做过一次——使用文件在磁盘上创建了一个持久队列。

以下是有关如何实现这一目标的指南:

  1. 该文件应包含一个标题,该标题指向下一个未处理的记录(条目)和下一个要写入的可用位置。
  2. 如果记录具有可变长度,则每条记录都应包含一个标明记录长度的标头。
  3. 您可能希望为每条记录添加一个标志,指示该记录是否已处理
  4. 文件锁定可用于确保没有人读取正在写入的文件部分
  5. 使用低级 IO - 不要使用任何类型的缓冲流,使用直接写入语义

这是读写的方案(可能有一些小的逻辑错误,但你应该能够从那里得到它):

读者

  1. 锁定文件头并读取它并解锁它
  2. 转到最后一个记录位置
  3. 读取记录头和记录
  4. 在已处理标志打开的情况下写回记录头
  5. 如果您不在文件末尾锁定标题并写入下一个未处理记录的新位置,否则写入一些标记以指示没​​有更多记录要处理
  6. 确保要写入的下一条记录指向正确的位置

您可能还希望读者偶尔为您压缩文件:

  1. 锁定整个文件
  2. 将所有未处理的记录复制到文件的开头(您可能希望保留一些逻辑以免覆盖未处理的记录 - 仅当已处理空间大于未处理空间时才可能紧凑)
  3. 更新标题
  4. 解锁文件

作家

  1. 锁定文件头并查看下一条记录要写入的位置然后解锁
  2. 锁定文件从要写入的地方到记录的长度
  3. 写入记录并解锁
  4. 如果未处理的记录标记指示没有要处理的记录,则锁定标题让它指向新记录解锁标题

希望这能让你进入写作轨道

于 2012-11-10T19:24:58.433 回答
0

您可以编写每行处理行的数据,每行的分隔符指示此记录是否处理

于 2014-07-01T11:21:14.660 回答