2011-11-17 118 views
1

我想有一種方法可以從多個線程添加異步任務,並在C++ boost :: asio應用程序中按順序執行它們。如何使用C++ boost :: asio按順序執行異步操作?

更新:我想做一個服務器到服務器通信,它們之間只有一個持久套接字,我需要通過它來排序多個請求。它需要將傳入的請求保存在一個隊列中,觸發第一個請求/等待它的響應並拿起下一個請求。我試圖避免使用zeromq,因爲它需要專用線程。

Update2:好的,下面是我結束了:併發工作線程是「排隊」使用服務器到服務器套接字與簡單的互斥體。通信阻止寫入/等待響應/讀取,然後釋放互斥鎖。簡單是吧:)

+1

我也很想擁有這個! –

回答

1

從ASIO documentation

異步完成處理程序將只從 正在調用io_service對象::運行的線程稱爲()。

如果您已經從調用多個線程io_service::run(),您可以在io_service::strand描述here包裝你的異步調用。

+0

實際上,鏈僅對同步任務進行排序。你不能用鏈對異步任務進行排序。這是一個例子。服務接受請求,並且需要請求輔助服務完成請求。我想一次將請求排序到次要服務的異步請求/異步響應。 – Roskoto

+0

@Roskoto:我不認爲這是真的。如果你看一下定時器5的例子,一個鏈用於同步對兩個不同線程中兩個不同deadline_timer的async_wait()的調用。當你提到輔助服務時,你是在談論另一個io_service對象?如果是這樣,也許解決方案是使用線程共享的單個io_service對象。那麼你應該能夠使用一個鏈來同步你的異步任務。或者我不理解什麼? – Sean

+0

我不認爲Timer.5就是一個很好的例子。它同時啓動兩個定時器並僅同步響應。是的,我只有一個io_service在多個線程中運行 – Roskoto

0

不知道我是否正確理解你,但client chat example中的方法有什麼問題嗎?消息被髮布到io_service線程,在寫入過程中排隊,並在寫入完成處理程序中彈出/發送。如果在此期間添加更多消息,則寫入處理程序會啓動下一個異步寫入。

根據您對Sean的評論,我也不明白多線程調用io_service :: run的好處,因爲您一次只能在一個持久套接字上執行一個async_write/async_read,即您只能調用async_write再次處理程序返回?調用線程的數量可能需要您使用互斥鎖來鎖定隊列。

AFAICT多線程調用io_service :: run的好處是提高同時服務多個請求的服務器的可伸縮性。

+0

該示例僅對請求進行排序而不等待任何響應。 – Roskoto

+0

@Roskoto:「答覆」是否意味着對服務器寫入的響應?如果是這樣,你還可以在寫入完成處理程序中啓動一個async_read? – Ralf