2011-03-14 5 views
0

boost :: asio는 라이브러리를 사용하여 비동기 시간 제한을 구현하는 방법의 예를 제공합니다. 클라이언트는 서버에주기적인 하트 비트 메시지를 보내고 하트 비트를 클라이언트로 되돌려 보냅니다. N 초 내에 응답하지 않으면 연결이 끊어집니다. boost_asio/example/timeouts/server.cpp를 참조하십시오. 이 예제에서 설명한 패턴은 곧 작업 할 프로젝트의 시작점이 될 것입니다. 단 하나의 주름이 있습니다. 클라이언트와 서버 모두 하트 비트 이외에 서로에게 메시지를 보내야합니다. 타임 아웃 예제는 하트 비트 에코 메시지를 큐에 푸시하고 후속 타임 아웃은 타임 아웃을위한 비동기 처리기로 하여금 실제로 소켓에 데이터를 쓰게합니다.boost :: asio timeouts 예 - 데이터 쓰기가 비쌉니다.

io_service를 실행하는 스레드에서 소켓에 대한 데이터를 쓰는 것은 run()에서 차단되므로 수행 할 수 없습니다. run_once()는 도움이되지 않습니다. 실행할 핸들러가있을 때까지 계속 차단하고 io_service에 대한 작업을 관리하는 복잡성을 도입합니다. asio에서 비동기 처리기 - 소켓 중 하나 인 쓰기 -는 io_service를 실행하는 스레드에서 호출됩니다.

따라서 메시지를 임의로 도입하려면 io_service 스레드 이외의 스레드에서 전송할 데이터를 큐에 푸시해야합니다. 이는 큐와 알림 타이머를 뮤텍스로 보호한다는 의미입니다. 메시지 당 두 개의 뮤텍스가 있습니다. 하나는 데이터를 대기열로 푸시하기위한 것이고 다른 하나는 소켓에 쓰기 위해 데이터를 대기열에서 제외시키는 핸들러에 대한 것입니다.

실제로 이것은 asio timeouts만의 질문보다 더 일반적인 질문입니다. run()에서 io_service 스레드가 차단되어 메시지 당 두 개의 뮤텍스를 사용하지 않고 데이터를 소켓에 비동기 적으로 쓸 수있는 패턴이 있습니까?

+0

왜 두 개의 뮤텍스가 필요한지 잘 모르겠지만 io_service가 이미 메시지를 보내는 경우 메시지 대기열을 보호해야합니다. 핸들러에 관해서는 동일한 뮤텍스를 사용하여 큐를 보호 할 수 있습니다. 여러 스레드에서 io_service :: run을 호출하지 않는 한? – Ralf

답변

1

다음과 같은 사항이 중요 할 수 있습니다. boost::asio strands은 핸들러를 동기화하는 메커니즘입니다. 여러 스레드 AFAIK에서 io_service :: run을 호출하는 경우에만이 작업을 수행하면됩니다.

io_service::post 메서드도 유용합니다.이 메서드를 사용하면 io_service :: run을 호출 한 스레드에서 코드를 실행할 수 있습니다.

+0

정보 주셔서 감사합니다. 나는이 질문을하기 전에 이것들을 살펴 보았다. post 메소드는 핸들러의 서명이 void 핸들러 (void) 여야하기 때문에 도움이되지 않습니다. 데이터를 전달할 수 없습니다. 스트랜드를보다 신중하게 살펴볼 필요가 있지만 큐에 데이터를 쓰는 것이 핸들러에서 발생하지 않으므로 스트랜드가 어떻게 도움이됩니까? – user658878

+0

boost :: bind (http://www.boost.org/doc/libs/release/libs/bind/bind.html)를 사용하여 메서드에 임의의 데이터를 바인딩 할 수 있습니다. – Ralf

+0

좋은 제안이 답변 일 수 있습니다. 덕분에 – user658878

관련 문제