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

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

我想将转换工具“下载到”下载工具中,在下载工具中创build一个启动转换代码的线程(这样它可以在下载时开始转换,减less下载和独立转换的总时间)。

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

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

这与multithreading同步执行相似吗? 如果是这样,这意味着下载的二进制文件需要是信号量访问的资源?

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

任何意见表示赞赏。

谢谢。

Solutions Collecting From Web of "如何使用线程同时下载和转换二进制文件?"

这是生产者 – 消费者问题的典型例子, download thread作为producerconversion thread作为consumer

谷歌周围,你会发现你的语言选择的实施。 这里有一些来自MSDN: 如何:实施各种生产者 – 消费者模式 。

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

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

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

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

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

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

编辑:我不确定如何设计一个线程安全的队列的指导方针,但我已经在以前的答案中发布了一个简单的代码。

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