2011-03-19 3 views
5

모든 예제에서 항상 모든 스레드에서 동일한 io_service를 실행하는 것처럼 보입니다.boost :: asio는 스레드에서 다른 서비스를 시작합니까?

io_services를 여러 개 시작할 수 있습니까? 여기에 내가하고 싶은 것입니다 :

시작 io_service을 사용자 입력을 처리하기위한 메인 스레드에서 ...

시작 후 작업자 스레드 모든 공유의 무리를 시작할 수있는 또 다른 스레드의 다른 io_service의 B io_service B.

io_service A의 사용자는 io_service B에서 작업을 게시하여 작업자 풀에서 완료되지만 io_service A, 즉 주 스레드에서 수행 할 작업을 수행 할 수 없습니다.

이것이 가능합니까? 이게 말이 돼?

감사합니다.

답변

1

좋은 질문입니다!

예, 가능은 1입니다. 응용 프로그램에서 나는 현재 시스템의 다른 측면을 담당하는 별도의 구성 요소로 응용 프로그램을 구성했습니다. 각 구성 요소는 자체 스레드로 실행되며 자체 타이머 세트가 있으며 asio를 사용하여 자체 네트워크 I/O를 수행합니다. 테스트 가능성/디자인 관점에서 보았을 때 구성 요소가 다른 구성 요소를 간섭 할 수 없기 때문에 내게 더 깨끗해 보였지만 문제가 해결되기 위해 서 있습니다. 필자는 매개 변수로 io 서비스에서 전달되는 모든 것을 다시 작성할 수 있다고 가정하지만 현재 그렇게 할 필요성을 알지 못했습니다.

질문에 다시 돌아 오면 원하는대로 할 수 있습니다. IMO 더 많은 경우 시도해보고 문제가 발생할 경우 변경하십시오. 또한

, 샘 밀러 (당신이 콘솔을 사용하는 경우 즉) 다른 포스트 WRT 처리 사용자 입력에 지적 무엇인지 살펴 걸릴 할 수 있습니다 : 그것은 정말, 내 경험에 https://stackoverflow.com/questions/5210796/boost-asio-how-to-write-console-server

+0

+1 내 대답은 posix :: stream_descriptor 사용법을 보여주는 링크입니다. –

2

을 CPU 당 io_service 또는 프로세스 당 하나가 더 나은 수행 인 경우 응용 프로그램에 따라 다릅니다. 몇 년 전이 주제에 관한 asio-users 메일 링리스트에 대한 토론이있었습니다.

Boost.Asio 설명서에는 HTTP Server 2 및 HTTP Server 3 예제의 몇 가지 좋은 예가 나와 있습니다 (showing these two). 그러나 두 번째 HTTP 서버는이 기술을 사용하는 방법을 보여줄 뿐이며 언제 또는 왜 사용해야 하는지를 보여주지 않습니다. 그러한 질문은 신청서를 프로파일 링하여 답변해야합니다. CPU 선호도 일종의 하나의 io_service

  • 여러으로 io_service 객체를
  • 스레드 풀 스레드
    1. 단일 Boost.Asio

      를 사용하여 응용 프로그램을 만들 때

      는 일반적으로 다음과 같은 순서를 사용한다

  • +0

    +1 흥미로운 토론 :) 내 시스템 디자인에 대해 궁금한 점이 있지만 아직 어떤 문제도 경험하지 못했습니다. – Ralf

    +0

    여기에 상황이 있습니다. 소켓과 stdio를 처리하는 하나의 스레드와 하나의 io_service가있는 응용 프로그램이 있습니다. 스레드가 아닌 이전의 저장 코드입니다.이제는 자체 io_service가있는 작업자 스레드 풀을 추가하고 주 스레드의 비 스레드 안전 코드와 상호 작용하지 않습니다. 작업자 풀은 별도의 데이터에서 별도의 코드를 실행하며 통신은 주 IO 서비스와 스레드 풀에서 실행되는 io_service 사이의 io_service 게시물을 통해 이루어집니다. 이 소리는 끝날 수 있니? –

    +0

    @Oliver 예, 할 수있는 것처럼 들립니다. 비록 그것이 나의 임무라면, 스레드가 아닌 코드를 가닥으로 고치고 io_service :: run()을 호출하는 스레드 풀과 함께 단일 io_service를 사용합니다. –

    관련 문제