쓰레드 사용시 질문입니다.
글쓴이: fedious / 작성시간: 수, 2011/10/12 - 5:47오후
QT에서QThread를 사용하고 있는데요
프로세스(기본쓰레드?, B)가 소켓으로 데이터를 전송받으면 데이터를 분리해서 구조체(st_A)에 저장해 놓은다음
A쓰레드를 호출하면서 구조체의 주소값을 넘겨줍니다. A쓰레드는 또 나름의 일을 합니다.
connect(&B, SIGNAL(CALLA(&st_A)), &A, SLOT(RECVB(&st_A)); (대략 이런식이죠)
B쓰레드에서 데이터를 구조체에 저장한 다음 결과를 fprintf로 출력하고,
A쓰레드에서도 데이터를 처리한 후에 결과를 fprintf로 출력을 합니다.
기본적으로는 B, A, B, A, B, A...이런 순으로 나와야 하는데
쓰레드B가 수신하는 데이터의 양이 많아지면
B,B,B,B,A,A,A,A 이런식으로도 출력을 하거든요
그럼 제가 궁금한게 쓰레드 A는 전달받은 구조체 주소의 변수를 사용할 때 동시성을 보장받지 못하는 건가요??
즉 A가 구조체에서 1번, 2번, 3번 순서로 데이터를 사용하는데 1번 데이터를 가지고 처리하는 동안 B가 데이터를 새로 받아 SIGNAL을 발생시키면 1, 2, 3이 새로 업데이트 되어 A는 1번 데이터는 과거 데이터를 사용하고 2, 3번 데이터는 새로 업데이트 된 데이터를 사용하는 경우를 말합니다.
이 문제를 해결하려면 데이터 전달받는 속도보다 더 빨리 데이터를 처리하는 수 밖에 없을까요??
질문이 잘 전달되었을지 모르겠네요;;ㅠ
Forums:
Thread is not running concurrently.
본래 스레드는 서로 연관성이 없이 독립된 연산항(함수든 프로시져든 시퀀셜이든 무엇)을 갖아야 합니다.
그리고 다른 종류의 스레드를 순차적으로 연결하려 하면 제대로 동작하지 않을 수도 있습니다.
큐나 스택을 둔다면 모르지만 말이지요. :)
하지만 말씀하신 것처럼 B가 수신하는 데이터가 많아지면, 스택도 깊어지고, 큐도 커져서 메모리 효율이 떨어질겁니다.
그래도 말씀하신 것처럼, 연산 후의 재처리(B가 처리하지 않았는데, A 연산이 연산하려 덤벼드는 문제)는 해결될 거라고 생각합니다.
아니면 캐쉬이론처럼 구조체에 '플래그'를 달아두시는 것도 방법이라 생각합니다.
A가 처리했다는 표시를 (Boolean 타입 변수로) 해두고, B가 처리한 후, 그 플래그를 지울 때까지, A는 다시 손을 못대는 방법이지요.
Dirty Bit를 두어서 A가 잘못된(갱신되지 않은 오래된) 자료를 다시 쓰지 않도록 하기 위한 방법입니다.
그렇다고 해서, B, B, B, B, A, A, A, A 의 순서는 바뀌지 않을 겁니다.
다른 종류의 스레드는 같이 움직이지 않습니다. 동시에 일처리를 하기 위해 스레드를 사용하기 보다는, 서로 연관성이 없는 독립된 연산을 빠르게 처리하기 위해 스레드를 사용하는 것이니까요.
기본적으로 모든 쓰레드는 비동기적으로
기본적으로 모든 쓰레드는 비동기적으로 활동합니다.
즉, 쓰레드 A와 B가 있을 경우,
어떠한 순서로 쓰레드들이 실행될지는 어떠한것도 보장되어 있지 않다는것이죠.
비동기적으로 움직이는 다수의 쓰레드를 특정 순서에 의해 동기적으로 움직이게끔 하시고 싶으면,
그렇게 만들면 됩니다.
쓰레드 동기화에 쓰이는 대표적인 도구는
conditional variable이 있습니다.
Qt에서는
QMutex, QWaitCondition 등을 사용하시면 됩니다.
The QWaitCondition class provides a condition variable for synchronizing threads.
thread, synchronize 라는 키워드로 검색해보셔도 대부분의 프로그래밍 랭귀지에서의
수많은 예제가 쏟아져 나옵니다.
이번기회에 한번 공부해보세요.
댓글 달기