|
아래 땅주인님의 얘기가 일반 적으로 맞고요
원래 경험이 없으면 너무 단순하게 생각하거나 너무 복잡하게 생각하는 문제가 발생합니다.
나중에 경험이 쌓이고 보면 참 괜한 걱정을 했다는 생각이 들게 마련이죠
일단 멀티 쓰레드 에서 공유하는 자원은 글로벌 객체, 또는 데이터로 만들어 두시고
그 자원이 정말로 Critical 하게 싱크를 맞추어야 하는 경우라고 생각되는 부분만
CriticalSection으로 막으면 됩니다. 그래서 CriticalSection이 있는거니까요
물론 다른 프로세스와도 공유하는 자원이라면 ( 그럴일은 거의 없지만)
메시지 처리나 Event나 뮤텍스를 사용하는 방법도 생각해 봐야 합니다.
복잡하게 메시지 처리 까지 생각할 필요 없습니다.
TList 를 사용하는데 여러 쓰레드에서 공유해야 하는 데이터라면
TThreadList 라도 클래스를 쓰면됩니다. 내부적으로 Lock 기능이 포함되 있죠
화면에 업데이트(Display) 해야 하는 데이터가 있을때 내가 주로 쓰는 방법은
쓰레드에서는 데이터 변수에만 써주고
화면에 표시는 타이머에서 해주고 있습니다.
대충 100~200 msec 타이머 쓰면 부하도 거의 안걸리고 실시간으로 표시되는것으로 보입니다.
멀티 쓰레드 프로젝트에서 디버깅을 돌리는것 경험상 거의 자살 행위로 보입니다.
최근 C++Builder 2010에서는 좀 나아지긴 했지만..
그렇지 않아도 불안정한 디버깅 모드에서 멀티쓰레드 디버깅까지 한다는것은 좀 비추입니다.
한가지 더 말씀드리면..
디버깅을 쓴다는것은 장비 PC에 C++빌더를 설치해서 디버깅하면서 돌리겠다는것인데.
별로 좋은 습관이 아닙니다.
장비가 라인 들어가면 양산을 타게되고
그럴때도 장비 PC에서 빌더로 디버깅하면서 돌린다는것은 좀 없어보입니다.
기본적으로 문제 생기는 것은 자기 소스에서 다 분석해서 해결해야 하고
굳이 디버깅 정보가 필요하다면
로그 데이터를 남길 수 있는 구조를 만드시는게 좋습니다.
참고할만한 서적은 찾아보셨겠지만.. 전혀 없고요
열심히 맨땅에 헤딩하다보면 깨우치는 것도 있겠고
이끌어 줄 사람이 있으면 더 빠르거야 당연하고요
어떤 일이든지...
쉽게 배우면 나중에 꼭 함정에 빠져서 댓가를 치루게 마련입니다.
대충 생각나는대로 말씀드렸는데.. 좀 도움이 되실런지 모르겠네요
바보 님이 쓰신 글 :
: 프로그램 작성중 여러가지 문제가 발생.. 몇가지 질문.
:
: thread 클래스를 상속받아서 작업용 클래스를 만들고
:
: Execute 에서 쓰레드가 실행된다 는 것은 이해 했는데..
:
: 이런 쓰레드 4개 정도 만들어서 돌리고 있는데
:
: 디버깅 포인터를 걸면 컴파일러가 멈추는 현상이 있습니다.
:
: 아마 동기화 때문에 그런거 같은데
:
: 지금 동기화 처리 한것.
:
: 쓰레드에서 UI을 건들면 안된다 -> 메세지 로 처리해서 메인폼으로 메세지를 보내고 있습니다.
:
: 1) 쓰레드에서 다른 쓰레드의 멤버 변수를 알고 싶은 경우도 메세지로 처리해야 되냐요 ?
:
: 지금은 그냥 읽어 옴.
:
: 그런대 위의 작업용 클래스에 멤버 함수와 멤버 변수를 다른 폼이나 참조 실행하면
:
: 문제가 되는 같습니다 .
:
: 클래스가 디버깅 포인트로 멈추면 다른 곳에서 그 쓰래드의 변수를 참조 하려할때.
:
: 같이 대기 하면서 문제가 되는 같은데 ?
:
: 궁금한것은..
:
: Execute 함수 실행 하는 곳에서는 다른 쓰레드 함수의 멤버 함수나 멤버 변수를 참조
:
: 읽어 오는 것도 안되는 것인가요 ?
:
: 또 Execute 에서 실행되지 않는 함수나 변수도 참조 하면 안되는 것인가요 ?
:
: 동기화라는 것이 변수를 변경할때 문제가 되는 것안가요 ?
:
: 지금 현상을 보면 쓰레드에서 동시 실행되는 로직만 넣어 두고
:
: 변수나 참고 해야 하는 값은 다른 곳에서 처리하고 쓰레드에 어떤 값을 전달 하려면 전부 메세지로 처리해야
:
: 한다는 결론 ?
:
: 쓰레드에 대해서 아는 것이 별로 없으니 ..이런 문제가 ...
:
: 혹시 참고 할만한 서적은 ?
:
: 혹시 아시분 ?
|