C 中的多线程应用程序

Multi threaded application in C++

本文关键字:应用程序 多线程      更新时间:2023-10-16

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

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

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

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

以下是如何实现这一目标的准则:

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

这是用于阅读和写作的方案(可能有一些小的逻辑错误,但您应该能够从那里进行):

阅读器

  1. 锁定文件标头并阅读并将其解锁
  2. 转到最后一个记录位置
  3. 阅读记录标题和记录
  4. 将记录标头写回带有处理的标志打开的
  5. 如果您不在文件的末尾,请锁定标头并编写下一个未加工记录的新位置,否则编写一些标记以表示没有更多的记录可以处理
  6. 确保将点写入正确地点的下一个记录

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

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

作者

  1. 锁定文件的标题,看看要编写下一个记录,然后解锁
  2. 将文件从要写入记录的长度
  3. 的地方锁定。
  4. 写记录并解锁
  5. 如果未加工的记录标记表示没有记录可以处理的记录,请锁定标题,请指向新记录解锁标题

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

win32API函数CreateFileMapping()允许进程共享数据,多个进程可以使用系统页码文件存储的内存映射文件。

一些好的链接:

http://msdn.microsoft.com/en-us/library/aa366551(vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v = vs.85).aspx

http://www.codeproject.com/articles/34073/inter-process-communication-ipc-indroduction-and-and-an-s

http://www.codeproject.com/articles/19531/a-wrapped-class-class-of-share-memory

http://www.bogotobogo.com/cplusplus/multithread2c.php

您可以编写每行过程行的数据,而每行的可分配者表示此记录处理是否是否