2013-04-25 4 views
0

저는 개발 단계에 있으며 C++에서 멀티 스레딩을 사용하여 일부 기능을 구현할 것을 고려하고 있습니다. 나는 멀티 스레딩의 기본에 익숙하지만 다른 사람들이 내 아이디어를 얻도록하고 싶다. 아직 멀티 스레딩 라이브러리를 선택하지 않았습니다 (Boost쪽으로 기울어 짐). 그러나 제 질문은 아마 선택한 라이브러리와 무관합니다.기본 C++ 멀티 스레딩

기본적으로 while 루프 (종료 될 때까지)에서 실행되며 다른 소프트웨어에서 채워지는 명령 대기열을 검사하는 클래스 (CommandGenerator라고 부름)가 있습니다. CommandGenerator가 대기열에서 메시지를 가져올 때마다 백그라운드에서 실행되는 스레드를 생성하고 대기열에서 꺼낸 데이터로 작업하기를 원합니다. 한편 CommandGenerator가 계속 실행되고 while 루프를 다시 돌아 다니며 새 메시지를 가져오고 다시 스레드를 다시 생성하려고합니다. 이것은 개념적으로 가능합니까? 코드를 반복하고 큐를 계속 확인하면서 생성 스레드가 완료 될 때까지 백그라운드에서 실행되도록 할 수 있습니까? CommandGenerator는 스레드를 제어 할 필요가 없습니다. 생성 된 후에는 독립적으로 실행할 수 있고 종료가 보장되지만 실행을 완료하는 데 최대 1 분이 걸릴 수 있습니다 (실행하기 전에 대기열에서 꺼내 진 메시지에 지정된 일정 시간 대기).

모든 의견을 환영합니다.

+1

빌트인 C++ 11의'threading' 모듈을 사용하실 것을 권장합니다. – Elazar

+1

C++에는 표준 라이브러리에 스레드 지원이 포함되어 있습니다. ''헤더를 참조하십시오. –

+2

Producer-Consumer 또는 Thread Pool 패턴과 같은 멀티 스레딩 개념에 익숙합니까? –

답변

0

예, 귀하의 개념은 상당히 실현 가능합니다. 그러나, 명목상으로 당신은 스폰 될 수있는 스레드 수에 대한 상한선을가집니다. 경계가 클 수 있습니다.

2

당신이하고 싶은 것을 "생산자 - 소비자"패턴이라고합니다.

수신 된 각 메시지에 대해 새 스레드를 작성하지 말 것을 강력히 권합니다. 그렇게하면 너무 많은 메시지를 받으면 시스템이 막힐 수 있습니다.

대신 메시지 큐를 읽는 고정 된 수의 소비자 스레드를 가지고 한 번에 하나의 메시지 만 처리하도록하십시오. 한 번에 너무 많은 메시지가 오면 처리 대기중인 대기열에 저장됩니다.

메시지를 가져 와서 실제로 처리하는 사이에 지연이 있으므로 다시 IMHO 솔루션은 메시지 당 하나의 스레드를 생성하는 것이 아니라 소비자 스레드 수를 늘리는 것입니다. 이렇게하면 리소스 사용을 제어 할 수 있습니다. 정확히 얼마나 많은 쓰레드가 당신의 애플리케이션에 전적으로 의존하고 있는지를 스스로 발견해야 할 것입니다.

구현에 대해서는 C++ 11을 사용하는 경우 std :: thread/std :: mutex 및 std :: condition_variable 만 있으면됩니다. C++ 03을 사용하는 경우 boost에 상응하는 클래스가 있습니다.

0

개념은 실현 가능하며 일반적인 멀티 스레딩 패턴과 매우 유사합니다. 하나의 패턴은 공유 스레드 안전 큐를 사용하는 것입니다. 생산자가 있습니다.이 경우 대기열에 작업을 푸시하는 CommandGenerator이 있습니다. 그런 다음 큐에 넣을 내용을 기다리는 소비자 스레드가 있습니다. 항목이 대기열로 푸시되면 스레드 중 하나 (그리고 단 하나) 만 항목을 가져 와서 처리 할 수 ​​있습니다.

이 방법을 구현하는 한 가지 방법은 std::threadstd::mutex입니다.

사용중인 컴파일러에 따라 심각하게 std::async을 봐야합니다. 이렇게하면 생성 될 스레드와시기를 알 필요가 없어집니다.

처리를 중지해야 할 때 어떻게되는지 알아야합니다. 예를 들어 CommandGenerator이 중지되면 처리 스레드가 중지 될 때까지 기다려야합니까?명령 처리 스레드는 어떻게 정지합니까? 대기열에 남아있는 항목은 어떻게됩니까? 이것들은 당신이 생각해보아야 할 디자인 결정입니다 (아직하지 않았다면).

+0

입력 해 주셔서 감사합니다. 명확히하기 위해이 응용 프로그램에서는 CommandGenerator가 절대로 중지되지 않는다고 가정 할 수 있습니다. 시작은 대기열에서 메시지를 기다린 다음 각각에 대해 하나 이상의 스레드를 작성하는 것입니다. 다시 말하면, 쓰레드 생성의 논리를 명확히하기 위해 각 메시지의 벽 시계 시간은 1-5입니다. 스레드가 메시지에서 매번 생성 될 것이고 모든 스레드는 주어진 시간이> = currentTime이 될 때까지 대기 한 다음 무언가를 수행합니다 (간단히 말해서 스레드 ID를 stdout에 인쇄한다고 가정합니다). 그 후에 스레드가 완료됩니다. – user2319717

+0

그동안 각 스레드가 실행을 기다리고 있지만 (최대 1 분 후) CommandGenerator가 대기열에서 새 메시지를 가져 와서 더 많은 스레드를 생성하기를 원합니다. – user2319717