자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
C++ Builder Thread안의 변수문의
2018.02.07 12:48
Multi thread프로그램을 만들고 있는데 thread안의 변수들이 서로 엉키는 같아 확인하기 위해 문의드립니다.
Class MyThread :TThread {
...
int m;
double pp, pm, pl, mR;
double Function();
...
}
MyThread * mMyThread [10];
mMyThread를 실행시킬 때 아래 execute안이 실행이 될텐데 이 때 m 값은 당연히 특정 mMyThread에 해당하고 그 thread만 실행되길 기대합니다.
void __fastcall MyThread::Execute() {
m = ....
do
....
mR = Function();
---
while (...)
}
void __fastcall MyThread::Function(void) {
pp =...
pm = ...
pl = ...
....
return mR;
}
질문 1
각 mMyThread 마다 thread안의 변수들 (m, pp, pm, pl등)은 각각 독립적인 변수를 가지게 되고 해당 값은 서로간에 영향을 주지 않아야 할 것 같은데 그런가요?
질문 2
Execute안에서 Function을 불러 실행을 시킬 때 해당 function안의 변수들은 특정 mMyThread변수가 사용되기를 기대하는데 그렇게 되나요? Synchronize를 사용하면 자동 해결되나요?
질문 3
그렇지 않다면 execute안에서 function을 부를 때 특정 thread를 지정할 수 있는 방법이 있나요?
현재 문제점은 위와 같은 구조에서 변수들이 서로 엉키고 있는 것 같습니다.
조언을 주시면 감사하겠습니다.
C++ Builder Thread안의 변수문의
2018.02.07 12:48
Multi thread프로그램을 만들고 있는데 thread안의 변수들이 서로 엉키는 같아 확인하기 위해 문의드립니다.
Class MyThread :TThread {
...
int m;
double pp, pm, pl, mR;
double Function();
...
}
MyThread * mMyThread [10];
mMyThread를 실행시킬 때 아래 execute안이 실행이 될텐데 이 때 m 값은 당연히 특정 mMyThread에 해당하고 그 thread만 실행되길 기대합니다.
void __fastcall MyThread::Execute() {
m = ....
do
....
mR = Function();
---
while (...)
}
void __fastcall MyThread::Function(void) {
pp =...
pm = ...
pl = ...
....
return mR;
}
질문 1
각 mMyThread 마다 thread안의 변수들 (m, pp, pm, pl등)은 각각 독립적인 변수를 가지게 되고 해당 값은 서로간에 영향을 주지 않아야 할 것 같은데 그런가요?
질문 2
Execute안에서 Function을 불러 실행을 시킬 때 해당 function안의 변수들은 특정 mMyThread변수가 사용되기를 기대하는데 그렇게 되나요? Synchronize를 사용하면 자동 해결되나요?
질문 3
그렇지 않다면 execute안에서 function을 부를 때 특정 thread를 지정할 수 있는 방법이 있나요?
현재 문제점은 위와 같은 구조에서 변수들이 서로 엉키고 있는 것 같습니다.
조언을 주시면 감사하겠습니다.
몇가지 질문을 개별적으로 답변드립니다.
질문1
쓰래드 내의 내부변수는 독립적으로 관리됩니다.
질문2
아래 함수가 좀 의아한데요. 반환 타입이 없는데 반환을 하네요.
void __fastcall MyThread::Function(void) {
pp =...
pm = ...
pl = ...
....
return mR;
}
익명함수를 사용하셨다는 가정하에 익명함수를 쓰레드변수에 지정 시 독립적으로 함수가 수행합니다.
단, 함수내에서 전역변수등을 사용했다면 독립적이지 않을 수 있습니다.
Synchronize 함수는 아시다시피 동기화함수로 함수안의 메소드를 순차적으로 진행하도록 조정합니다.
일부 효과가 있을 수 있지만 자동 해결까지는 아닙니다^^
질문3
이 질문은 저도 잘 모르겠습니다.
조언
쓰래드를 다루는 작업은 상당히 어려운 작업입니다.(이미 경험하셨겠지만요^^)
보통 어려운 작업을 진행하실때에는 기본부터 차근차근 이해하며 진행하셔야 경험이 쌓일겁니다.
제가 봤을 때는 질문1의 문제를 정확히 이해하시면 큰 진전이 있을것 같습니다.
간단한 샘플을 작성해 보시기 바랍니다. 쓰래드마다 조건을 주고, 조건에 따라 내부 변수를 변경하도록 구현하고 해당 내용을 확인하도록 샘플을 작성해 보시기 바랍니다.
내부 변수를 확인하는 과정은 OutputDebugString과 같은 메소드를 이용해 이벤트로그(IDE 또는 DbgView로 확인)로 확인하시면 멀티-쓰래드 영향없이 정확한 값을 확인하실 수 있을 것입니다.
그리고, 다음 글에 쓰래드에 고유이름을 지정하거나 디버깅하는 팁들이 포함되어 있으니 참고하시기 바랍니다.
http://www.devgear.co.kr/products/rad-studio/featurelist/