2012-11-09 54 views
1

我有一個std::iostream對象(例如fstream),我想用boost::asio使用異步操作。那可能嗎?我知道asio不支持文件操作,但有時非常有用地處理文件IO。我可以使用特定於平臺的本地文件描述符,然後將它們與asio一起使用,但我認爲使用標準C++流將在C++中更加優雅,並且更加便攜。有沒有辦法使用boost :: asio使用std :: iostream對象?

+0

由於快速異步IO機制往往是相當低層次的平臺特定,我認爲標準庫流太抽象,不適合您的需求。我相當肯定你在這個特定的例子中運氣不好。如果boost沒有提供某種異步流,那麼您必須爲此尋找另一個第三方庫。 – Rook

+0

哪個平臺? –

+2

'boost :: asio'不是一個通用的異步I/O庫,它直接針對的是非平凡的支持select或類似系統調用的長延遲流。對於具有磁盤文件的異步I/O,需要完全不同的API。 –

回答

1

雖然Boost.Asio的不支持的文件操作,它爲以異步方式執行文件操作的應用程序提供的工具集。完成此操作的常用方法是使用Boost.Asio創建一個線程池。應用程序會將文件操作發佈到線程池中,並立即返回。然後線程池將同步執行操作,並在完成時調用或發佈完成處理程序。

有幾點考慮:

  • 允許應用程序在線程池的併發級別提示。這將允許線程池分配足夠的線程以適應應用程序的預期需求。
  • 完成處理程序將被調用的線程。例如,它可以在執行同步操作的同一個線程中執行,也可以發佈到發佈文件操作時提供給池的不同的io_service
  • 完成處理程序的同步或異步行爲。例如,如果完成處理程序是strand::wrap的結果,那麼它將與工作線程異步調用。因此,完成處理程序的參數必須保持有效,直到處理程序被調用。這通常可以通過允許參數傳遞或移動來解決。

最後,libuv是一個C庫,提供同步和異步文件操作。它可以作爲一個有價值的基礎實施或參考材料。

相關問題