[출처] 멤버 함수를 쓰레드 함수로 만들기.|
멤버 함수를 쓰레드 함수로 만들기.
오늘은 간단한 C++ 프로그래밍 기법에 대해 하나 써볼까 합니다.
간단한 기교를 부려볼 겸 클래스의 멤버함수를 쓰레드 함수로 작성하는 방법을 배워 보도록 하겠습니다.
(간단히 쓰레드 사용법도 배우고 일석이조! 야호! )
아직까진 그런 적은 없지만, 쓰레드를 돌릴 때 간간히 멤버함수를 쓰레드 함수로 제작하고플 때가 있더군요.
혹, 그런 분들을 위해 알려 드리겠습니다.
class TestClass {
INT B;
VOID TestFunction( INT A ) { B = A }; //이 함수를 쓰레드로 돌리고자 합니다. VOID Start(); //이 함수에서 TestFunction을 호출하지요.
}; |
Start() 멤버 함수에서 TestFunction()을 쓰레드로 돌리고자 한다고 해보죠.
VOID TestClass ::Start()
{
HANDLE hThread = ( HANDLE ) __beginthread( NULL, 0, &TestFunction, NULL, NULL, NULL ); // ........ 무엇가의 작업을 하고.
WaitForSingleObject( hThread, INFINITE ); CloseHandle( hThread ); } |
물론 안됩니다. 쓰레드로 돌아갈 함수는 정적으로 선언되어야 하며 정적 함수여야 하죠. 따라서,
class TestClass {
static VOID WINAPI TestFunction( INT A ); // 이제 원래 의도대로 이 함수를 정적 함수로 제작합니다. VOID Start();
}; |
역시 물론 안됩니다. 직접 닥쳐보시면 알겠지만, 우리가 돌리고자 했던 TestFunction 함수에서는 B라는 비정적 멤버를 참조하고 있습니다.
결국은 다른 방법을 찾아야 합니다.
class TestClass {
VOID TestFunction( INT A ); //다시 원래대로 돌리고 static VOID WINAPI TestFunctionThread( LPVOID ); //대신 쓰레드가 돌아갈 정적 함수를 만듭니다. VOID Start();
}; VOID Start() {
HANDLE hThread = ( HANDLE ) __beginthread( NULL, 0, &TestFunctionThread, this, NULL, NULL ); // ........ 무엇가의 작업을 하고.
WaitForSingleObject( hThread, INFINITE ); CloseHandle( hThread );
}
VOID WINAPI TestFunctionThread( LPVOID p ) { ( (TestClass* ) p )->TestFunction( 3 ); }
|
자, 위 예를 통해 해결했습니다. 포인터. 즉 동적 호출을 통해서 정적 멤버 함수를 호출하였습니다.
TestFunction의 인자 값도 동적으로 주고 싶다면,
struct Arg { TestClass* p; INT A; };
VOID Start() {
Arg arg = { this, 3 };
HANDLE hThread = ( HANDLE ) __beginthread( NULL, 0, &TestFunctionThread, &arg, NULL, NULL ); // ........ 무엇가의 작업을 하고.
WaitForSingleObject( hThread, INFINITE ); CloseHandle( hThread );
}
VOID WINAPI TestFunctionThread( LPVOID p ) { Arg* pArg = ( Arg* ) p; pArg->p->TestFunction( p->A ); } |
'운영체제 & 병렬처리 > Multithread' 카테고리의 다른 글
프로세스 환경변수(자식 프로세스에서 부모의 핸들값으로부터 등록된 값 가져오기) (0) | 2012.11.01 |
---|---|
IPC(inter-process communication) 프로세스간의 통신 (0) | 2012.11.01 |
부모 자식의 관계로 엮여 있는 프로세스, [커널 오브젝트와 핸들의 종속관계] (0) | 2012.11.01 |
CreateThread() 와 _beginthreadex() 함수의 차이 (0) | 2012.10.31 |
쓰레드와 프로세스 (0) | 2012.10.31 |