如何使用线程同时下载和转换二进制文件?

时间:2010-06-21 21:21:19

标签: c++ windows multithreading winapi

我有一个从另一台PC下载二进制文件的程序 我还有另一个独立的程序,可以将这个二进制文件转换为人类可读的CSV。

我想将转换工具“带入”下载工具,在下载工具中创建一个启动转换代码的线程(因此它可以在下载时开始转换,减少下载和转换的总时间独立地)。

我相信我可以成功启动另一个线程,但如何将转换线程与主下载同步?

即。转换赶上下载,需要等待更多下载,然后再次开始转换等。

这与Synchronizing Execution of Multiple Threads类似吗?如果是这样,这意味着下载的二进制文件需要是信号量访问的资源吗?

我是在正确的道路上还是在开始之前我应该​​指向另一个方向?

感谢任何建议。

谢谢。

3 个答案:

答案 0 :(得分:3)

这是producer-consumer problem的典型案例,download threadproducerconversion threadconsumer

Google周围,您将找到适合您所选语言的实施方案。以下是MSDN中的一些内容:How to: Implement Various Producer-Consumer Patterns

答案 1 :(得分:2)

下载到文件的Intead,您应该将下载的数据写入管道。转换线程可以从管道读取,然后将转换后的输出写入文件。这将自动同步它们。

如果您需要原始文件以及转换后的文件,只需让下载线程将数据写入文件,然后将相同的数据写入管道。

答案 2 :(得分:2)

是的,您无疑需要信号量(或类似事件或关键部分之类的东西)来保护对数据的访问。

我的直接反应是主要考虑一系列的块,而不是整个文件。其次,我几乎从不直接使用信号量(或类似的东西)。相反,我通常会使用线程安全队列,因此当网络线程读取一个块时,它会将一个结构放入队列中,说明数据的位置等等。处理线程等待队列中的项目,当一个项目到达时,它会弹出并处理该块。

当它完成处理块时,它通常会将结果推送到另一个队列以进行下一个处理阶段(例如,写入文件),并且(很可能)将处理后的块的描述符放到另一个队列上,因此可以重新使用内存来读取另一个输入块。

至少根据我的经验,这种类型的设计消除了百分比的线程同步问题。

编辑:我不确定如何设计线程安全队列的准则,但我已经在previous answer中发布了一个简单的代码。

就设计模式而言,我已经看到这至少被称为“管道”和“生产线”(虽然我不确定在很多文献中我都看过后者)。