我想用超時實現async_connect()。async_connect()超時與多個線程執行io_service.run()
async_connect_with_timeout(socket_type & s,
std::function<void(BoostAndCustomError const & error)> const & connect_handler,
time_type timeout);
當操作完成connect_handler(error)
調用與error
指示操作結果(包括超時)。
我希望能使用timeouts example 1.51的代碼。最大的區別是我使用多個工作線程執行io_service.run()。
需要進行哪些更改才能使示例代碼正常工作?
我的問題是:
當調用:
Start() { socket_.async_connect(Handleconnect); dealine_.async_wait(HandleTimeout); }
HandleConnect()
可以在另一個線程完成之前就async_wait()
(不可能的,但有可能)。我是否需要strand
包裝Start()
,HandleConnect()
和HandleTimeout()
?如果
HandleConnect()
首次調用沒有錯誤,但deadline_timer.cancel()
或deadline_timer.expires_from_now()
失敗,因爲HandleTimeout()
「已排隊等待調用在不久的將來」?看起來像示例代碼讓HandleTimeout()
關閉套接字。這種行爲(連接之後我們開始一些操作後愉快地開始連接後,計時器關閉連接)很容易導致嚴重的頭痛。如果
HandleTimeout()
和socket.close()
先被調用,該怎麼辦?HandlerConnect()
有沒有可能已經「排隊」而沒有錯誤?文檔說:「任何異步發送,接收或連接操作都將立即取消,並且會在出現boost::asio::error::operation_aborted
錯誤時結束。」多線程環境中的「立即」意味着什麼?
預計什麼樣的線程'Start()'函數運行?它是「io_service」線程還是其他「用戶」線程之一? –
@IgorR。我正在使用[HTTP Server 3示例](http://www.boost.org/doc/libs/1_51_0/doc/html/boost_asio/examples.html)中的線程池。更確切地說:我的「用戶」線程使用io_service.post()。 – Daszek
@IgorR。 'Start()'將從'io_service'線程調用'io_service.run()'被調用。 – Daszek