2013-02-20 3 views
3

일부 비동기 TCP 통신을 위해 boost :: asio를 사용할 때 많은 내부 스레드 (3 ~ 4 개)가 시작된다는 것을 알게되었습니다. the documentation에서 읽기, 그것은boost :: asio 내부 스레드

"The implementation of this library for a particular platform may 
make use of one or more internal threads to emulate asynchronicity" 

지금 내 lib 디렉토리 (클라이언트가 제공되며, 지금 io_service::run()을 시작하는 일 제외) 추가 스레드를 시작하지 않는 매우 엄격한 요구 사항을 가지고 말한다. boost :: asio가 이러한 추가 스레드를 만드는 것을 막을 수있는 방법이 있습니까?

다른 방법으로는 하나의 스레드에서만 실행할 수있는 비동기 라이브러리가 있습니까?

답변

5

적절한 변환 단위로 BOOST_ASIO_DISABLE_THREADS을 정의하여 에뮬레이트 된 비동기 작업 지원을 비활성화 할 수 있습니다. The documentation 당신이 platform specific implementation notes를 찾지 못하면 정의

Explicitly disables Boost.Asio's threading support, independent of whether or not Boost as a whole supports threads.

에 대한 대답이있다, 그것은 명확하게 작업이 에뮬레이션을 사용하는 상태. 예를 들어 나는 거의 모든 플랫폼에서이 방법으로 에뮬레이트 된 async_resolve()을 알고 있는데 스레드는 async_resolve()의 첫 번째 호출시 만들어집니다. 일부 (모든?) Windows 플랫폼은 deadline_timer 작업과 같은 몇 가지 다른 작업을 에뮬레이트합니다.

스레딩 지원을 비활성화하는 대신 에뮬레이트 된 작업을 피할 수도 있습니다. 개인적으로 프로젝트에 BOOST_ASIO_DISABLE_THREADS을 사용하지 않았으므로 다른 부작용이 있는지 확실하지 않습니다.

+2

'BOOST_ASIO_DISABLE_THREADS'가 정의되면, Asio는 쓰래드를 생성하려고 할 때'boost :: asio :: error :: operation_not_supported' 오류를 던집니다. 따라서 유일한 옵션은 스레드 생성 작업을 방지하는 것입니다. 대부분의 구현에서는'async_resolve()'대신'resolve()'를 사용하면됩니다. Windows에서'BOOST_ASIO_DISABLE_IOCP'를 정의하면 Asio가 선택 기반 구현을 사용하게됩니다.이 구현은 느리지 만 추가 스레드를 생성해서는 안됩니다. –

+0

감사합니다. 실제로이 문서를 전혀 찾지 못했습니다. DISABLE_IOCP를 사용해 보겠습니다. – Rolle

1

특정 플랫폼에서 스레드가 생성되는지 실제로 테스트 해 보셨습니까? 아무도 없으면 문제가 해결됩니다! 어떤 경우에는 libevent 또는 libev와 같은 다른 라이브러리를 고려할 수 있습니다. Qt와 같은 다양한 라이브러리가 제공하는 다른 비동기 이벤트 루프 중 하나 또는 모두가 작동 할 수 있습니다.

+0

예 나는 그들이 산란하는 것을 보았습니다. 또한이 lib는 많은 플랫폼으로 이식된다 – Rolle