簡體   English   中英

從libevent移植到boost :: asio:什么是ASIO中libevent事件的直接等價物?

[英]Porting from libevent to boost::asio: what is a direct equivalent of libevent's event in ASIO?

我正在嘗試向基於libevent的庫反向移植以使用ASIO后端(從而在單個應用程序中避免多個事件循環)。 還有其他方法可以解決“問題”,但我對此感興趣

在Boost :: ASIO文檔中,我沒有看到event對象的直接等價物(或者更確切地說,是一個句柄 - 因為libevent是用簡單的C編寫的); boost :: asio :: strand看起來很熟悉,但它似乎沒有遵循libevent的模式:創建,期望,接收,做工作{,重復}。

我需要的是擁有一組對象/事件/事件回調,除非在io_service的循環之上運行回調(通過套接字事件),否則可以創建和忘記回調。 Boost中有類似的東西嗎?

Boost.Asio沒有提供與libevent 事件相當的東西。

在Boost.Asio中,創建一個I / O對象,例如socket (1)。 然后,程序將啟動一個操作,例如socket.async_receive(buffer, &handler) (2),表示它希望將數據從套接字讀入buffer ,並在讀取數據后調用handler event in libevent, but one key difference is that Boost.Asio's Proactor will read data from the socket into buffer on behalf of the user, rather than informing the user that data is available to be read. 此步驟類似於在libevent中創建非持久性事件,但一個關鍵區別是Boost.Asio的Proactor將代表用戶將數據從套接字讀取到buffer ,而不是通知用戶數據可用於讀。 最后,Boost.Asio會將請求轉發給操作系統(3)。

. 然后,操作系統將以與libevent事件變為時類似的方式通知io_service數據可用於讀取(4)。 在某些時候,應用程序將通過io_service::run() (5)處理事件循環,就像libevent的event_base_loop() 由於可以讀取數據,Boost.Asio會將數據從套接字讀入buffer ,然后將用戶的回調( handler )發布到准備調用的回調隊列中(6)。 然后,應用程序將在處理事件循環時調用回調。

Boost.Asio強烈關注I / O對象而不是操作:

  • 每次應用程序有興趣處理I / O對象上的事件時,都必須啟動操作。 在這方面,整體流程類似於僅使用非持久性事件的libevent程序。
  • 操作無法識別。 Boost.Asio不提供libevent為操作提供的相同級別的控制。 read event and write event on a socket, libevent allows the write event to be removed via event_free() without affecting the read event. 例如,如果應用程序在套接字上具有讀取事件和寫入事件,則libevent允許通過event_free()刪除寫入事件,而不會影響讀取事件。 另一方面,由於Boost.Asio中無法識別操作,因此只能取消所有掛起的操作,例如通過socket.cancel() ,而不是取消特定的操作,例如寫入但不能讀取。

源圖像和一般細節可以在這里找到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM