0

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


就我而言,有两种选择:

  • 图片链接
  • 带有图像链接的文本文件和其他文本文件的链接(带有其他链接)。

我正在尝试使用posix mutexposix semaphore在C++(在 unix 上)创建一个多线程下载器。

应用程序具有指向第一个文本文件的链接。


  1. 线程休眠(信号量 = 0)。
  2. 主线程下载第一个文本文件。
  3. 解析其他链接——将链接放入某个队列(信号量 += links_count——> 其他线程唤醒)。
  4. 其他线程产生其他链接。

主线程呢?如何检查其他线程——完成状态?


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


谢谢你的想法。

4

1 回答 1

1

好吧,您的问题仍然是生产者/消费者问题,但您的消费者也是生产者。处理问题的一些方法:

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

编辑

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

于 2012-06-02T19:37:24.707 回答