2014-01-12 3 views
5

같은 Sample1Sample2: 다른 스레드 풀을 다른 작업에

내가 생각 구현하고 싶었 무엇 간단한 스레드 풀을 만드는 방법에 대한 그물에 많은 사례가 다른 작업에 대해 별도의 스레드 풀을 가지고있다이다 . 예를 들어, 응용 프로그램은 들어오는 TCP 연결을 처리하기위한 스레드 풀 (네트워크 풀이라고 부름)과 데이터베이스 (데이터베이스 풀)와 통신하기위한 다른 풀을 가질 수 있습니다.

이러한 들어오는 tcp 요청에는 데이터베이스의 정보가 필요할 수 있습니다. 이 경우 데이터베이스 풀의 해당 스레드에 쿼리를 수행하도록 요청하고 결과를 비동기 적으로 반환해야합니다.

boost :: asio를 사용하는 것이 좋습니다. 각 수영장마다 하나의 io_service 인스턴스가 있어야합니까? 그리고 그 스레드는 서로 어떻게 통신해야합니까 (부스트 사용)?

이 모든 것을 설명하기 위해 이해할 수있는 코드는 그리 짧지 만 사소한 것이 아니지만 가급적 일종의 의사 코드를 사용하면 많은 도움이 될 것입니다.

감사합니다.

+2

IMO, 가장 간단한 방법은 모든 끌어 오기를 별도의 'io_service'에 넣는 것입니다. 의사 소통을 위해,이'io_service' 사이에'post '펑터를 넣을 수 있습니다 (그러나 어떤 스레드가 게시물을 처리하는지 알 수 없습니다). –

답변

2

스레드/스레드 풀 간의 통신은 스레드 안전 큐를 통해 이루어져야합니다.

예를 들어 네트워크 연결을 처리하기위한 네트워킹 스레드 풀, 네트워크 요청을 실행하기위한 프로세스 풀 및 데이터베이스 연결/스레드 풀 (데이터베이스 당 하나의 풀, 데이터베이스 연결 당 하나의 스레드, 가능하면 동일한 데이터베이스에 대해 여러 개의 연결을 가질 수 있습니다).

또한 네트워크 풀, 프로세스 풀 및 각 데이터베이스 풀에 대한 스레드 안전 큐가 필요합니다.

데이터베이스에서 정보를 가져와야하는 네트워크 요청이 있다고합시다. 네트워크 스레드에서 실행하는 동안 요청을 수신하고 요청에 대한 처리기를 프로세스 대기열에 추가합니다.

(프로세스 스레드에서) 프로세스 핸들러는 요청에 데이터베이스에서 무언가가 필요하다는 것을 알게되고 데이터베이스 요청뿐만 아니라 콜백 핸들러를 적절한 데이터베이스 큐에 추가합니다.

적절한 데이터베이스 스레드는 데이터베이스 큐에서 요청을 가져 와서 쿼리를 실행하고 결과를 다시 얻은 다음 결과를 콜백 처리기에 추가합니다. 그런 다음 데이터베이스 결과가 포함 된 콜백 핸들러 객체가 프로세스 큐에 푸시됩니다.

(프로세스 스레드의) 콜백 처리기는 요청을 계속 실행하고 응답 메시지를 패키지화 한 다음 네트워크 대기열에 푸시합니다.

(네트워크 스레드의) 네트워크 처리기는 응답 메시지를 받아서 전달합니다 (필요한 경우 인코딩).

스레드 안전 큐의 예는 here입니다.

조금 복잡 하긴하지만 어쨌든 here에 대해 이야기하고있는 것을 처리 할 수있는 응용 프로그램 서버의 구현을 볼 수 있습니다.하지만 수행하려는 작업이 과도 할 수도 있습니다. 소스 코드는 매우 잘 문서화되어 있으므로이를 따라갈 수 있고 무엇을하는지 볼 수 있어야합니다.

내 예제에서는 asio (동일한 시스템에서 TCP Connection implementation 참조)에 boost를 사용하지만 핸들러에는 boost io_service를 사용하지 않습니다.

+0

늦게 답변 해 주셔서 감사 드리며 죄송합니다. 질문있어. 귀하의 예에서 세 개의 풀 (네트워크, 프로세스, 데이터베이스)이 있습니다. 네트워크 풀이 설명한 것과 동일한 메커니즘을 사용하여 일종의 스레드 안전 메시지 큐를 통해 데이터베이스 풀에 직접 연결되도록 두 개의 풀만 있으면 제대로 작동합니까? 다시 한번 감사드립니다. – TDL