반응형

자바는 쓰레드를 쓸려면,
thread클래스를 상속받거나..
runnable인터페이스를 첨부해서 run쓰레드만 구현하면 땡입니다만..

c++은 그렇게 쉽게 안됩니다..
플랫폼 종속적이라니 머니 해도.. java가 역시 편하긴 편하죵.

가령 윈도우 플랫폼에서는
_beginthreadex()로 쓰레드를 생성하는데..
문제는 여기서 요구하는 3번째 인자(start_address)가 WINAPI 콜백함수로 클래스 멤버 메소드로
포함시킬수 없다는 문제가 있습니다.

그냥.. 전역함수로 만들어 쓰면 되긴합니다만,  기껏 클래스 만들어 쓰는데, 딱히 그렇게 하기도 뭐하죠? --;;

정확히는 클래스에 포함된 메소드래서 안되는게 아니라,
단일하지 못해서 그런것 같습니다. 클래스 정의는 하나지만 구현은 여러개 할수 있잖아요.

고로  클래스 안에 콜백 메소드를 넣을려면 걍 static로 선언해 버리면 됩니다.

static UINT WINAPI AAA::hello(LPVOID p)

근데, 문제는 요렇게 해서 넣어 놓으면
static메소드 특성상 멤버 변수를 조작할수 없는게  또 문제가 됩니다.

그럼 우짤까요?

우짜긴요. static 멤버메소드에서 걍 다른 멤버 메소드를 또 호출해서 쓰면 됩니다.

UINT WINAPI AAA::hello(LPVOID p)
 {
  AAA *aaa = (AAA*)p;
  aaa->print();   //print는 일반 멤버 클래스
 
  return 0;
 }

물론 LPVOID p는 _beginthreadex()에서 보내준 클래스 주소(this 값)을 보내서 받습니다.
아래는 main까지 포함한 소스입니다.

#include <process.h>
#include <windows.h>

class AAA
{
public:

 AAA(const char *str)
 {
  int a = strlen(str);
  memcpy(&m_str,str,strlen(str)+1);
 }

 ~AAA()
 {}

 static UINT WINAPI hello(LPVOID p)
 {
  AAA *aaa = (AAA*)p;
  aaa->print();
 
  return 0;
 }

 void start(void)
 {
  _beginthreadex(NULL,0, hello, (LPVOID)this,0,NULL);
 }


private:
 char m_str[10];
 
 void print(void)
 {
  printf("%s\n",m_str);
 }

};


void main()
{
 AAA aaa("hello");
 aaa.start();
 Sleep(5000);
}

Sleep은  메인스레드가 먼저 종료될까봐 넣은 겁니다.
빙빙~ 돌려서 결국 클래스 안에 콜백함수를 넣었습니다.

전역함수를 원하지 않는 객체지향으론
이렇게 어떻게든 클래스 안에 포함시켜서 전역함수 사용을 최소화 해야겠고.. --;;
요걸로 확장해나가면
서버쪽 쓰레드생성을 포함한 singleton 패턴을 만들수 있습니다.

하지만 c/c++ 특성상 전역함수 사용은 어쩔수 없는것 같습니다.
뭐, main자체가 전역함수니깐요.

반응형

'C / C++' 카테고리의 다른 글

[C/C++] template를 이용한 singleton 패턴 사용.  (2) 2009.12.24
Collaborative Filtering  (0) 2009.01.19
C++에서 XML 파일 읽기  (0) 2008.09.09
libcmtd.lib LNK2005 - 중복 선언 에러  (0) 2008.05.09
반응형

COM Apartment

COM의 Threading model에 대한 자료, 아래 사이트와 문서 자료로 정리한 것입니다. (DOIT, COM+, Essential COM의 Apartment내용을 보고 추가하고 Proxy / Stub을 추가 정리하자) COM을 사용할때 서버측에서는 일괄된 사용을 보장해야 한다. 위치 투명성을 보장하여 어디서든 호출 가능해야 하기 때문에 Proxy / Stub이 필요함과 동시에 재작된 클라이언트 어플리케이션에서 단일 쓰레드로 사용하거 멀티 쓰레드에서 사용하는 상황에서도 멀티쓰레드가 고려되지 않은 COM 오브젝트는 안전하게 구동되어야 한다.이에 Microsoft는 COM Thread model로 Apartment라는 것을 정의 한다.
  • Apartment는 COM 오브젝트를 Threading model에 따라 구분/배치하기 위한 논리적 공간
  • Apartment는 쓰레딩 모델을 공유하는 개체들이 존재하는 곳, 모든 객체는 Apartment안에서 들어야 한다.
  • Apartment는 하나의 프로세스에 하나식만 존재 합니다. 하나의 프로세스에 여러 Apartment가 있을 순 있지만 Apartment가 여러 프로세스에 걸쳐 존재할 수 없다.
  • Apartment에는 여러개의 Thread가 있을 수 있지만 하나의 Thread는 여러개의 Apartment에 있을 수 없습니다.
  • 단일 프로세스내에 오브젝트들이 Apartment라고 불리는 몇몇의 그룹으로 나누어져 있고 COM 오브젝트는 정확히 하나의 Apartment내에 있고 오브젝트의 메소드들은 그 Aparment에 속한 쓰레드들에 의해서만 호출 될 수 있다. 다른 쓰레드들이 이 오브젝트를 호출하기 위해서는 마샬링이 필요하다.
  • CoInitialize?(Ex)를 통해서 Apartment에 들어간다.

STA, Single Thread Apartment

  • 프로세스는 여러개의 STA를 가진다 STA는 쓰레드를 하나만 가진다.
  • STA는 하나의 쓰레드만이 들어 갈수 있으면 들어 올 수 있는 쓰레드는 STA를 만든 쓰레드이다.
  • 윈도우의 경우 호출은 우니도우즈 메시지 큐를 사용한다.

MTA, Mutil Thread Apartment

  • 하나의 프로세스는 하나의 MTA만 가질 수 있다.
  • MTA는 여러 COM오브젝트를 가질 수 있다.
  • STA와는 달리 동기화에 신경 써주어야 하며 Thread-context가 줄어든다.
  • Reference counting되어서 쓰레드 집입을 카운트하여 쓰레드가 나갈때 카운트는 줄어들며 0이되면 사라진다.
  • COM오브젝트가 쓰레드가 요구한 Apartment와 호환이 되면 그 Apartment에 객체가 생성되여 raw pointer를 얻게되지만 호환이 되지 않는다면 다른 Apartment에 생성이 되고 proxy객체에 대한 포인터를 얻게 된다.

COM thread model: Main Thread

  • COM객체는 프로세스 상에서 가장 먼저 만들어진 STA와 호환된다는 것을 의미한다.
  • Main Thread다(entry pointer가 있는). 호환이 되지 않는 쓰레드에서 객체 생성이 요구되면 객체는 Main thread에서 만들어진 Apartment에서 생성이 되면 쓰레드는 Proxy 객체에 대한 포인터를 받는다.
  • 모델은 하위 호환성을 위해서만 존재하고 만약 동기화를 지원하지 않는 객체를 작성할때는 Apartment thread 모델을 사용한다.

COM thread model: Apartment Thread

  • COM객체는 STA와 호환되다는 것은 의미한다.
  • MTA에 들어간 쓰레드가 이 객체를 생성하면 객체는 새로운 쓰레드를 하나 만들고 그 쓰레드에 STA를 만들어 Proxy 객체 포인터를 리턴한다.
  • 이 모델은 Thread Affinity를 지니는 기능(CRITICAL_SECTION, TLS등)을 사용하거나 UI관련된 기능을 지니는 객체의 경우 추천된다. STA모델이고 필요할 경우 STA를 생성함으로 별도의 동기화 방법은 필요없다.
  • 비베(6.0?)의 경우 Main thread와 Apartment thread를 지원하는데 가능한 이 모델을 구현해야 한다.

COM thread model: Free Thread

  • COM객체는 MTA와만 호환이 된다는 것을 의미한다.
  • STA에 들어간 쓰레드가 Free thread를 지원하는 COM객체를 만들면 객체는 MTA에서 만들어진다.
  • MTA가 존재하면 그 MTA에 만들어지고 아니라면 새로운 쓰레드가 생성되고 MTA를 생성한다. 그리고 Proxy 객체 포인터를 리턴한다.
  • 동기화가 지원되어야 한다.

COM thread model: Both

  • COM객체는 쓰레드가 어떤 Apartment에 속해 있건 모두 호환된다는 것을 의미한다.
  • 쓰레드가 속한 Apartment에 생성되며 무조건 raw pointer를 리턴한다.
  • 생성된 COM객체는 여러 쓰레드가 사용 할 수 있음으로 동기화가 지원되어야 한다.

COM thread model: Neutral (NA)

  • 윈도우즈 2000에서 추가된 모델
  • COM객체는 TNA(Thread Neutral Apartment)와 호환되며 객체는 무조건 TNA에 만들어진다.
  • NA는 Proxy객체 포인터만 리턴한다. 쓰레드 무조건 COM객체의 Proxy 객체에 대한 포인터를 얻게 된다.
  • 프로세스당 하나의 Neutral apartment를 가진다.
  • 동기화가 지원되어야 한다.
  • COM+ 모델이 나온후 지원하기 위해 생긴 Apartment이다.
  • NA는 컴포넌트가 순차적인 접근을 허용할 뿐만 아니라, 어느 스레드에서 든지 수행할 수 있다.
  • Role-base security, 비동기적 객체 실행, out-of-process 서버에서 실행 중인 객체 인스턴스를 참조하는 새로운 내장 모니커(moniker)가 추가되었다.
반응형

+ Recent posts