2012-06-02 50 views
0

對於這種情況,我正在尋找一個已知的解決方案(如生產者 - 消費者問題)。多線程 - 已知的相似性解決方案


在我的情況下,有兩種選擇:

  • 鏈接圖像,與鏈接圖像和鏈接到其他的文本文件
  • 文本文件(其它鏈接)。

我試圖創建一個使用POSIX互斥POSIX信號C++一個多線程下載器(在UNIX上)。

應用程序已鏈接到第一個文本文件。


  1. 線程睡眠(旗語= 0)。
  2. 主線程下載第一個文本文件。
  3. 解析其他鏈接 - 將鏈接放入某個隊列(信號量=鏈接計數 - >其他線程喚醒)。
  4. 其他線程產生其他鏈接。

什麼主線程? 如何檢查其他線程 - 完成狀態?


使用有限隊列可能存在死鎖:文本文件包含許多鏈接(隊列與其他文本文件一樣完整)。沒有文本文件可以完成。


謝謝你的想法。

+0

這是功課嗎? –

+0

@JeremyFriesner不,我會嘗試爲備份圖像創建一個小工具。文本文件由我們的網站生成。 – Nanik

回答

1

那麼,你的問題仍然是一種生產者/消費者問題,但你的消費者也是生產者。處理問題的一些方法:

  • 不要限制您的隊列大小。當你的程序內存不足時就會失敗。不是很優雅,但可能在99.99%的所有下載場景下工作(假設平均每個下載鏈接100個字節,可用內存大約2GB,則在內存不足之前,您必須在隊列中存儲超過2000萬個鏈接)。
  • 通過使用硬盤作爲緩衝區來分割您的製作者和消費者。將文件下載到臨時文件夾中。讓一個線程監視新文件的文件夾。一旦出現新文件,解析它並將這些項目放入消費者隊列中。一旦文件完成解析後,將其放入最終的下載位置。這樣你只受到磁盤空間的限制。這樣你的生產者(解析器)是一個不同於你的消費者(下載器)的線程。

編輯

您可以在工作線程pthread_join在主線程等待。

+0

謝謝:-)。什麼時候終止應用程序? – Nanik

+0

@Nanik:看到我更新的答案 - 'pthread_join'是你的朋友。 – ChrisWue