2012-11-02 120 views
4

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

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

+0

你需要使用文件?为什么不使用内存守护它与互斥体? – Rolle

+3

另一种方法可能是使用数据库(SQLite,SQL Server CE,...) – Alex

+3

我警告你,如果你的应用程序被杀死,并且你正在使用缓冲IO,那么你可能会比你想象的要更担心。 – WhozCraig

回答

3

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

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

下面是关于如何实现这一目标的指导方针:

  1. 该文件应包含一个报头指向下一个未处理记录(进入),并到下一个可用的地方写。
  2. 如果记录的长度是可变的,那么每个记录应该包含一个表示记录长度的标题。
  3. 您可能要添加到每个记录一个标志,表示该记录是否被处理
  4. 文件锁定可用于确保从被写入
  5. 使用低级别文件的部分没有人阅读IO - 不要使用任何类型的缓冲流,使用直接写入语义

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

READER

  1. 锁定文件头和阅读并解锁回
  2. 转到最后一个记录位置
  3. 阅读记录头和记录
  4. 写记录头回来翻了处理标志on
  5. 如果你不在文件末尾锁定标题并写下下一个未处理记录的新位置否则写一些标记以表示没有更多记录要处理
  6. Ma柯确保下一个记录写点到正确的地方

您可能还希望读者在一段时间后压缩该文件为您提供:

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

撰稿人

  1. 锁定文件的头,看看下一个记录将被写入然后解锁
  2. 锁定来自地方的文件被写入记录的长度
  3. 写入记录并解锁
  4. 如果未处理的记录标记指示没有要处理的记录,请锁定标题让它指向新的re绳解开头

希望这将你写的轨道

2
+0

对不起,我忘了提及我的应用程序也需要在Linux上工作。 –

+0

有在UNIX系统的类似API:见[MMAP(http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html)。 – didierc

0

你可以写,这是每行分隔符工艺生产线的每一行数据表明,如果这个记录处理或不