컴퓨터 공부/COM&ActiveX

[6월 18일 1교시] Apartment

려리군 2009. 6. 18. 09:32

참고주소 : http://www.codeguru.com/cpp/com-tech/activex/apts/article.php/c5529


Apartment

logical한 공간 : COM 개체를 접근하는 쓰레드가 살고 있다. COM 개체는 없을 수도 있다.

COM과 thread가 어떠한 관계가 있느냐에 초점을 둔다.

 - STA(Single Thread Apartment) : 하나의 쓰레드가 apt에 있다.

 - MTA(Multiple Thread Apartment) : 여러개의 쓰레드가 apt에 있다.

 - Both : STA, MTA 모두 가능.

 - Neutral : 쓰레드와 COM 개체가 별도로 있는 상황.


STA 

STA로 입장하는 호출은 메세지로 변환되고 메세지 큐로 보내진다.

메세지들은 메세지 큐로부터 받을 수 있고 STA에서 실행되는 쓰레드에 의해 한번에 하나씩 메소드 호출로 변환된다.

Apartment가 여러개 존재한다. 내부적으로 apartment들 사이에 marshalling이 발생한다.


MTA

같은 apartment에서는 marshalling할 필요가 없다.

콜백은 다른 RPC 쓰레드로 전송될 것이기 때문에 교착상태(deadlock)가 발생하지 않는다.

※ Thread-safe : 쓰레드 자체가 동기화를 구현해 놓았다.


쓰레드에 apart가 배정되는 방법

CoInitialize(NULL); // STA

CoInitialize(NULL, COINIT_APARTMENTTHREADED); // STA

CoInitialize(NULL, COINIT_MULTITHREADED); // MTA

예시) § 쓰레드, [] apartment

Main STA : [§] 1. CoInitialize(NULL);

STA : [§] 2. CoInitialize(NULL, COINIT_APARTMENTTHREADED);

MTA : 3. CoInitialize(NULL, COINIT_MULTITHREADED);

§] 4. CoInitialize(NULL, COINIT_MULTITHREADED);

STA : [§] 5. CoInitialize(NULL, COINIT_APARTMENTTHREADED);

※ COM 개체는 CoCreateInstance하는 쓰레드가 속한 apartment에 생성된다.

※ CoUninitialize를 해줘야 apartment가 해제가 된다.


In-proc 객체가 배정되는 방법


Out-of-Proc 객체가 배정되는 방법

COM서버가 STA 방식으로 생성되었을 경우 COM서버에 message queue가 존재한다.


STA

COM은 STA에 서비스를 제공하는 숨겨진 윈도우로 개별적인 메세지를 보냄으로서 STA 쓰레드로 들어오는 호출을 전달한다.

MTA


NTA

Windows 2000에 추가됨. 


※ marshalling되지 않은 인터페이스로는 apartment 사이에 포인터를 전달할 수 없다.

(전역변수로 그냥 공유하면 안된다.)

apartment끼리 marshalling방법

CoMarshallInterThreadInterfaceInStream

CoGetInterfaceAndReleaseStream

Global Interface Table(GIT)


쓰레드 모델

none : Main STA하나만 존재

both(모두) : 클라이언트에 따라서 결정됨.


※ 쓰레드 모델이 MTA나 Both일 경우는 TLS사용을 피해라.