我有一个从另一台PC下载二进制文件的程序 我还有另一个独立的程序,可以将这个二进制文件转换为人类可读的CSV。
我想将转换工具“带入”下载工具,在下载工具中创建一个启动转换代码的线程(因此它可以在下载时开始转换,减少下载和转换的总时间独立地)。
我相信我可以成功启动另一个线程,但如何将转换线程与主下载同步?
即。转换赶上下载,需要等待更多下载,然后再次开始转换等。
这与Synchronizing Execution of Multiple Threads类似吗?如果是这样,这意味着下载的二进制文件需要是信号量访问的资源吗?
我是在正确的道路上还是在开始之前我应该指向另一个方向?
感谢任何建议。
谢谢。
答案 0 :(得分:3)
这是producer-consumer problem的典型案例,download thread
为producer
,conversion thread
为consumer
。
Google周围,您将找到适合您所选语言的实施方案。以下是MSDN中的一些内容:How to: Implement Various Producer-Consumer Patterns。
答案 1 :(得分:2)
下载到文件的Intead,您应该将下载的数据写入管道。转换线程可以从管道读取,然后将转换后的输出写入文件。这将自动同步它们。
如果您需要原始文件以及转换后的文件,只需让下载线程将数据写入文件,然后将相同的数据写入管道。
答案 2 :(得分:2)
是的,您无疑需要信号量(或类似事件或关键部分之类的东西)来保护对数据的访问。
我的直接反应是主要考虑一系列的块,而不是整个文件。其次,我几乎从不直接使用信号量(或类似的东西)。相反,我通常会使用线程安全队列,因此当网络线程读取一个块时,它会将一个结构放入队列中,说明数据的位置等等。处理线程等待队列中的项目,当一个项目到达时,它会弹出并处理该块。
当它完成处理块时,它通常会将结果推送到另一个队列以进行下一个处理阶段(例如,写入文件),并且(很可能)将处理后的块的描述符放到另一个队列上,因此可以重新使用内存来读取另一个输入块。
至少根据我的经验,这种类型的设计消除了大百分比的线程同步问题。
编辑:我不确定如何设计线程安全队列的准则,但我已经在previous answer中发布了一个简单的代码。
就设计模式而言,我已经看到这至少被称为“管道”和“生产线”(虽然我不确定在很多文献中我都看过后者)。