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.run()'을 호출하는'io_service' 스레드에서 호출됩니다. – Daszek