쓰레드를 사용할때 객체지향적으로 코딩하려면 어떻게 해야하나
글쓴이: bejoy4him / 작성시간: 화, 2005/07/05 - 1:12오후
윈도 환경에서 VC++가지고 프로그램을 짜다가 쓰레드를 써야할일이 있어서
사용하다보니 객체지향과는 완전 작별을 하더군요.
다른 좋은 방법이 있었겠지만, C++쪽은 완전 초보인지라 그렇게 흘러갈수 밖에 없었습니다.
그렇게 엉망을 만들어놓고 생각해보니 다른 좋은 방법이 있지 않을까하는 생각이 들어서
이곳에 글을 올리게 되었습니다.
그렇게 깔끔하지는 않지만, 멤버 변수들은 왠만하면 protected,private등으로 선언해놓고
필요에 의해 클래스내에 쓰레드를 당연히 만들수 있을것이라고 생각하고 쓰레드를 만들려고 하니
static이 아니면 만들수가 없더군요. 문제는 static으로 만들어버리면 static이 아닌 멤버 변수및
함수에 접근,호출할수가 없을것이라는 생각이 들더군요..
그래서 울며 겨자먹기로 쓰레드를 전역함수로 선언하고나니.. 그 쓰레드에서 객체에 접근할때
public으로 접근할수 밖에 없어 protected,private등으로 선언된 녀석들을 하나씩 public으로
접근지정자를 수정하니, 이게 뭐하는 짓인가 하는 생각이 들더군요.
분명, 다른 길이 있을거라는 생각과 함께 이곳에 글을 올리게 되었네요.
다른 좋은 방법을 알려주시면 감사하겠습니다.
좋은 답변. 미리 감사드립니다.
Forums:
이 책과Thinking In C++, Volume 2: Practic
이 책과
Thinking In C++, Volume 2: Practical Programming
Bruce Eckel, President, MindView, Inc.
Chuck Allison, Utah Valley State College
(특히, 11장 Concurrency...)
음 pdf파일로 책을 구하거나, 링크로 보거나, 하나 사거나....
이 라이브러리면 어떨까요?
http://zthread.sourceforge.net/
thread 함수에 this 포인터를 넘겨주고,thread 함수에서
thread 함수에 this 포인터를 넘겨주고,
thread 함수에서 받은 포인터로 적절한 함수를 호출해주면 됩니다.
위분도 말씀하셨지만..
뭐 대략 이런 식이죠...
class MyThread
{
public:
bool Create( ... )
{
HANDLE thread = ::CreateThread( ..., thread_proc, (void *)this, ... ) ;
return thread != NULL ;
}
virtual int Run( void ) = 0 ;
private:
static int thread_proc( void *p )
{
MyThread *pThis = (MyThread*)p ;
return pThis->Run() ;
}
} ;
이것 저것 만들다보면...
쓰레드를 가장 잘 쓰는 방법은 안 쓰는 것이다...
뭐 이런말이 가슴을 후벼팝니다... ㅠ.ㅠ;;
그럼에도 불구하고 쓸수밖에 없는 상황은... ㅠ.ㅠ;;
--------------------------------------
재미없는 일은 하지 말자는 인간 쓰레기.
-.-;
Test 클래스의 Work()를 쓰레드로 실행할 때 보통은 다음과 같은
Test 클래스의 Work()를 쓰레드로 실행할 때 보통은 다음과 같은 방법을 사용합니다.
boost::thread는 플렛폼 중립적인 라이브러리 입니다. 제가 알기로는 다음 C++ 표준에도 들어가는 것으로 알고 있습니다. 동기화 장치들을 사용할 때는 boost::thread의 boost::mutex::scoped_lock 를 사용하시면 실수로 데드락에 빠지는 것을 막아줍니다.
위의 예제는 다음과 같이 사용할 수 있습니다.
----------------------------------------
http://moim.at
http://mkhq.co.kr
우웃
윈도우 VC에서는 기본적으로 쓰레드를 객체 지향적으로 사용하지 않나요?
API로 쓴다면 모를까 MFC에서는 기본적으로 클래스화 되어 있습니다.
객체 지향=클래스냐고 물으신다면 ?? 그건 논외로 하고..
MFC에서는 쓰레드를 CWinThread 객체로 관리를 합니다.
Worker쓰레드는 함수로 돌아가지만,
그 쓰레드를 CWinThread포인터로 관리하고,
UI쓰레드는 처음부터 CWinThread를 상속받아 돌아가는 클래스 객체입니다.
더욱이 UI쓰레드는 메시지 큐까지 가지고 있어서,
윈도우객체와 매우 비슷하죠.
VC에서의 쓰레드만큼 사용하기 쉬운 것은 잘 못보았는데요.....
[code:1]==============================
예전에 심심해서(?) 짰던 코드인데 참고바래요~ :D
저도 디스트럭터에 5초동안 종료를 기다리고 삭제되도록 넣어놓고 썼었죠..
저도 디스트럭터에 5초동안 종료를 기다리고 삭제되도록 넣어놓고 썼었죠.. ㅎㅎ
ㅡ_ㅡ;
댓글 달기