gpt4 book ai didi

c++ - C++中的多线程应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:10 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

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

读者

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

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

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

作者

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

希望这能让你走上写作轨道

关于c++ - C++中的多线程应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13198122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com