C 中的多线程应用程序
Multi threaded application in C++
我正在处理在C 中编程的多线程应用程序。我使用一些临时文件在线程之间传递数据。一个线程将要处理到目录中的文件中的数据写入。另一个线程将目录扫描以获取工作文件,并读取文件并进一步处理文件,然后删除这些文件。我必须使用这些文件,因为如果我的应用在何时被杀死,则必须保留尚未处理的数据。
,但我讨厌使用多个文件。我只想使用一个文件。一个线程不断写入文件和其他线程读取数据并删除已读取的数据。 就像从顶部填充的容器一样,在底部我可以从容器中删除数据。如何在C 中有效地做到这一点,首先是一种方法..?
使用诸如sqlite之类的数据库的评论中建议的问题可能是一个很好的解决方案。但是,如果您坚持使用文件,那么这当然是可能的。
我自己做一次 - 使用文件在磁盘上创建一个持久的队列。
以下是如何实现这一目标的准则:
- 该文件应包含一个标题,该标头指向下一个未加工的记录(条目)和下一个要写入的地方。
- 如果记录的长度可变,则每个记录应包含一个标题,该标头指示记录长度。
- 您可能需要在每个记录中添加一个标志,以指示是否已处理记录
- 文件锁定可用于确保没有人从文件写入的部分中读取
- 使用低级IO-不要使用任何类型的缓冲流,请使用直接写作语义
这是用于阅读和写作的方案(可能有一些小的逻辑错误,但您应该能够从那里进行):
阅读器
- 锁定文件标头并阅读并将其解锁
- 转到最后一个记录位置
- 阅读记录标题和记录
- 将记录标头写回带有处理的标志打开的
- 如果您不在文件的末尾,请锁定标头并编写下一个未加工记录的新位置,否则编写一些标记以表示没有更多的记录可以处理
- 确保将点写入正确地点的下一个记录
您可能还希望读者偶尔为您压缩文件:
- 锁定整个文件
- 将所有未经处理的记录复制到文件的开头(您可能需要保留某些逻辑,因为不覆盖未经处理的记录 - 只有在处理的空间大于未经处理的空间时,才可能紧凑) )
- 更新标题
- 解锁文件
作者
- 锁定文件的标题,看看要编写下一个记录,然后解锁
- 将文件从要写入记录的长度 的地方锁定。
- 写记录并解锁
- 如果未加工的记录标记表示没有记录可以处理的记录,请锁定标题,请指向新记录解锁标题
希望这能在写入轨道上设置您
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
您可以编写每行过程行的数据,而每行的可分配者表示此记录处理是否是否
- 通过安装信号处理程序关闭多线程应用程序
- 多线程 gtkmm 应用程序最简单的示例
- 将数组作为多线程应用程序中函数的返回传递
- 修改多线程应用程序中的对象
- 多线程 C++11 应用程序中的同步
- 多线程Windows GUI应用程序中的死锁
- C++多线程应用程序将永远挂起
- 具有多线程应用程序的 Nanomsg 无阻塞双向套接字
- 在接收 SIGINT 操作时适当地关闭多线程 c++ 应用程序
- 如何在多线程应用程序中获得花费的时间
- Linux VM(重型多线程应用程序)的性能改进
- C 多线程崩溃应用程序
- 在C 多线程应用程序中,设置了并发线程的最大数量
- C++多线程应用程序崩溃
- 如何在 Mac 上的 C++ 应用程序中使用多线程?
- 多线程应用程序中的零MQ处理中断
- 使用C 的多线程应用程序中测量全局时间(壁挂)的最快方法
- 如何在多线程应用程序中使用 pybind11
- C++应用程序多线程中的锁定方法
- PPL任务-桌面应用程序UI线程中的延续