多线程 - 已知的相似性解决方案

时间:2012-06-02 19:02:17

标签: c++ multithreading posix

我正在为这种情况寻找一个已知的解决方案(作为生产者 - 消费者问题)。


在我的情况下,有两种选择:

  • 链接到图片
  • 带有链接的文本文件,以及指向其他文本文件的链接(包含其他链接)。

我尝试使用 posix mutex posix信号量 C ++ (在unix上)创建多线程下载器。

应用程序已链接到第一个文本文件。


  1. 线程睡眠(信号量= 0)。
  2. 主线程下载第一个文本文件。
  3. 解析其他链接 - 将链接放入某个队列(信号量+ = links_count - >其他线程唤醒)。
  4. 其他线程产生其他链接。
  5. 主线是什么? 如何检查其他线程 - 完成状态?


    使用有限队列可能存在死锁:文本文件包含许多链接(队列与其他文本文件一样完整)。没有文本文件可以完成。


    感谢您的想法。

1 个答案:

答案 0 :(得分:1)

嗯,你的问题仍然是生产者/消费者的问题,但你的消费者也是生产者。解决问题的一些方法:

  • 不要限制队列大小。当您的进程耗尽内存时,只会失败。不是很优雅但可能会在99.99%的所有下载场景中工作(假设平均每个下载链接100个字节,大约2GB可用内存,在内存耗尽之前,你必须在队列中存储超过2000万个链接)。
  • 使用硬盘驱动器作为缓冲区拆分生产者和使用者。将文件下载到临时文件夹中。让线程监视该文件夹的新文件。出现新文件后,解析它并将项目放入使用者队列中。文件完成解析后,将其放入最终下载位置。这样您只受磁盘空间的限制。这样你的生产者(解析器)就是一个与你的消费者(下载者)不同的线程。

修改

您可以在主线程中使用pthread_join等待工作线程。