안녕하세요. C++ Builder XE5로 진행중입니다.
프리랜서 분과 같이 작업 중인데.. 구성한 방식에 좀 .. 의문이 생겨서요..
A Thread -> Queue -> Main Thread
B Thread -> Queue -> Main Thread
C Thread -> Queue -> Main Thread
Main Thread는 다른 Thread(A/B/C)가 Queue에 데이터를 채우기를 기다리다가,
데이터가 들어오면 Queue의 데이터를 꺼내서 main logic를 연결하는 구조입니다.
문제는 Main Thread가 Queue에 뭔가 들어오기를 기다리는 로직이 100ms 씩 Sleep하고 Queue 쳐다보고,
없으면 다시 100ms Sleep 하고.. 이런 구조로 되어 있습니다. 다른 Threa에서 명시적인 Event를 받지 못하니,
100ms Sleep하고, 모든 Queue를 다 뒤져보아야 하는 구조라 좀 .. 이상한 생각이 듭니다.
그리고, Main Thread 가 Sleep으로 기다려야 하는 것도 좀 마음에 걸리구요..
pseudo code로 쓰면 대략 아래와 같습니다.
// MainThread
while ( !bTerminate) {
if ( AQueue is not empty ) do something ...
if ( BQueue is not empty ) do something...
...
Sleep(100); // 100ms 동안 queue가 차기를 기다림.
}
저의 경우 A/B/C Thread가 Queue에 데이터를 채우고, TEvent와 같은 것으로 Main Thread에
명시적으로 Event를 알려주고, Main Thread는 TEvent->WaitFor(1000)와 같은 것으로 Event가 오기를 기다리고,
명시적인 Event가 오면 이 Event에 따라 해당 Queue의 데이터를 꺼내 처리하는 방식으로 처리합니다.
그리고, 기다리는 동안 Time Expire(보통 1000ms) 되면 , 모든 Queue 처다보기, 이런 식으로 처리를 하는데요..
pseudo code로 쓰면 대략 아래와 같습니다.
//MainThrea
while ( !bTerminate) {
Result = GEvent->Wait(1000); // Event 오기를 1초간 기다림.
if ( Result == wrSignaled ) do something.. // 특정 Queue에서 바로 pop하여 처리
else if ( Result == wrTimeout ) do something.. // 모든 Queue 순회
else // nothing to do..
}
..
어느 쪽을 써도 동작은 되고, 말썽없이 돌아가면 ..뭐.. 그냥 저냥..쓰는데요..
기왕이면 좀더 세련되게 구성하고 싶고, 좀더 이해하기 편한 구조, 읽기 좋은 코드를 구성하고 싶은데요..
어느 방식이 좀더 나을 지 ..
..
저의 생각은 Sleep()을 쓰는 게 좀 걸립니다. Sleep()을 쓰고, Main Thread와 A/B/C Thread간 아무런 동기화 작용도 없고,
좀 뻘쭘한 구성이 되지 않을까 하는 ..
..
다른 분들 의견은 어떠신 지? 궁금하네요..
..
프로그램이라는 게 정답은 없지만, 그래도 좀더 나은 구조, 쉬운 코드 읽기등이 좋지 않을까 하네요.
..
감사.