2009-12-31 24 views
1

我使用C++進行編碼,並且試圖異步加載圖像文件。經過一番研究,我發現了一些關於使用boost :: asio和boost :: iostreams來做到這一點的提及。然而,boost :: asio的文檔和示例大多與套接字相關,所以對我沒有多大幫助。需要關於使用boost :: asio和boost :: iostreams(或不同的東西)加載異步非阻塞文件的幫助:

這是我需要的。

  • 負荷異步和負載完成後一個文件,執行的回調函數(在我的情況下,回調函數使用V8引擎執行JavaScript函數對象的JavaScript引擎)
  • 回調函數必須在與主函數相同的線程中執行。 (因爲v8不是線程安全的。)
  • 需要在linux和windows上工作。 (不同的實現都ok)

所以,這樣的事情將是非常好的:

async_read("test.jpg", &the_callback_function); 

的功能不應該阻止,並在文件加載完成後,它應該運行「the_callback_function」。

編輯:正如joshperry指出的那樣,boost :: asio可能無法返回主線程。所以,我想我不必僅限於boost :: asio和boost:iostreams。任何可以幫助這個需求的c/C++庫都應該沒問題。謝謝!

+0

當異步讀取完成後,您希望如何分派回主線程? – joshperry 2009-12-31 15:09:00

+0

好吧......我不確定。我想到協同程序可能會完成這項工作。基本上,coroutine + non-blocking io應該在理論上工作。所以我想阿西奧可能不適合這個法案。 – 2009-12-31 15:14:47

+0

回到主線程將會很困難。沒有好的方法來發信號通知未等待的線程。主線程在做什麼工作?它是否可以經常檢查並查看文件讀取是否完成? – Pace 2009-12-31 15:30:52

回答

1

你可以用更多腳手架來做你想做的事情,但爲了讓回調在你的主線程上執行,主線程必須等待一些信號,表明回調已經準備就緒。這是一種方法。我假設你的主線程已經有了某種形式的執行循環。

  • 添加一個線程安全通知隊列,後臺線程可以使用這個通知隊列來通知要執行的回調主線程。
  • 修改您的主執行循環以等待該隊列以及它等待的任何其他事件源(顯然,我假設您在主線程中有一個事件驅動循環,如果您不這樣做,請適應口味: )。
  • 繼續使用帶回調的async async_read,只有回調函數不會直接執行完成函數,而是會將其排隊到主線程執行。

使用STL和同步對象(例如Boost.Thread提供的那些)可以輕易地構建這樣的隊列並不困難。把它擴展到無吞吐量的高吞吐量是另一回事,但它聽起來並不像你需要那種縮放。即使其他圖書館會爲你做這一切,但對於任何正在進行多線程編程的人來說,自己構建這樣的東西都是一個很好的練習,特別是如果涉及的一個或多個組件不可重入時。

相關問題