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

C+中的多线程应用+; 我正在研究一个用C++编程的多线程应用程序。我使用一些临时文件在线程之间传递数据。一个线程将要处理的数据写入目录中的文件。另一个线程扫描目录中的工作文件,读取文件并进一步处理,然后删除这些文件。我必须使用这些文件,因为如果我的应用程序在运行时被终止,我必须保留尚未处理的数据,c++,multithreading,file-io,C++,Multithreading,File Io,但我讨厌使用多个文件。我只想使用一个文件。一个线程持续向文件写入数据,另一个线程读取数据并删除已读取的数据。 就像一个容器从顶部和底部填充一样,我可以从容器中获取和删除数据。如何在C++中高效地进行这一操作,首先有一种方法吗?p> win32Api函数CreateFileMapping()允许进程共享数据,多个进程可以使用系统分页文件存储的内存映射文件 一些好的链接: 正如在对您的问题的评论中所建议的那样,使用类似SQLite的数据库可能是一个非常好的解决方案。 但是,如果您坚持使用文件

但我讨厌使用多个文件。我只想使用一个文件。一个线程持续向文件写入数据,另一个线程读取数据并删除已读取的数据。
就像一个容器从顶部和底部填充一样,我可以从容器中获取和删除数据。如何在C++中高效地进行这一操作,首先有一种方法吗?p> win32Api函数
CreateFileMapping()
允许进程共享数据,多个进程可以使用系统分页文件存储的内存映射文件

一些好的链接:


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

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

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

  • 文件应包含一个标题,该标题指向下一个未处理的记录(条目)和下一个可写入的位置
  • 如果记录具有可变长度,则每个记录应包含一个说明记录长度的标题
  • 您可能希望向每个记录添加一个标志,指示是否已处理该记录
  • 文件锁定可用于确保没有人读取正在写入的文件部分
  • 使用低级别IO-不要使用任何类型的缓冲流,使用直接写入语义
  • 下面是读写方案(可能有一些小的逻辑错误,但您应该能够从中吸取教训):

    阅读器

  • 锁定文件头并读取它,然后将其解锁
  • 转到最后一个记录位置
  • 读取记录头和记录
  • 在启用“已处理”标志的情况下写回记录头
  • 如果您不在文件末尾,请锁定标题并写入下一个未处理记录的新位置,否则请写入一些标记以指示没有更多的记录要处理
  • 确保要写入的下一条记录指向正确的位置
  • 您可能还希望读取器偶尔为您压缩文件:

  • 锁定整个文件
  • 将所有未处理的记录复制到文件的开头(您可能希望保留一些逻辑,以免覆盖未处理的记录-可能只有在处理的空间大于未处理的空间时才会压缩)
  • 更新标题
  • 解锁文件
  • 作者

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

  • 希望这将您设置在写入轨道上

    您可以写入每行处理的数据,每行的delimeter指示是否进行此记录处理

    您需要使用文件吗?为什么不使用内存来保护互斥体呢?另一种方法可能是使用数据库(SQLite、SQL Server CE等)。我警告您,如果您的应用程序被杀死,并且您使用的是缓冲IO,那么您需要担心的事情比您最初想象的要多。我不能使用内存,我不能在我的应用程序被杀死时丢失数据,因为数据将被淹没,将其写入数据库是一个好主意吗?数据库可能比从多个线程访问的文件更适合,而且还有事务的概念。事务确保ACID(原子的、一致的、隔离的、持久的)-我想这就是您要寻找的。抱歉,我忘了提到我的应用程序也需要在Linux上工作。unix系统中有一个类似的API:请参阅。