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

时间:2012-11-02 15:18:09

标签: c++ multithreading file-io

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

  1. 该文件应包含一个标题,指向下一个未处理的记录(条目)和下一个可写入的位置。
  2. 如果记录的长度可变,则每条记录应包含一个表示记录长度的标题。
  3. 您可能希望在每条记录中添加一个标志,指示记录是否已处理
  4. 文件锁定可用于确保没有人从正在写入的文件部分读取
  5. 使用低级别IO - 不要使用任何类型的缓冲流,使用直接写入语义
  6. 以下是阅读和写作的方案(可能有一些小的逻辑错误,但你应该可以从那里拿出来):

    <强> READER

    1. 锁定文件标题并阅读并将其解锁
    2. 转到最后一个记录位置
    3. 阅读记录标题和记录
    4. 将处理过的标记打开后写回记录标题
    5. 如果您不在文件的末尾,请锁定标题并写入下一个未处理记录的新位置,否则请写一些标记以表示没有更多要处理的记录
    6. 确保写下的记录指向正确的位置
    7. 您可能还希望读者偶尔为您压缩文件:

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

        1. 锁定文件的标题并查看下一条记录的写入位置然后将其解锁
        2. 将文件从要写入的位置锁定到记录的长度
        3. 写下记录并解锁
        4. 如果未处理的记录标记表示没有要处理的记录让它指向新记录解锁标题,则锁定标题
        5. 希望这能让你踏上写作​​轨道

答案 1 :(得分:2)

答案 2 :(得分:0)

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