출처: http://blog.naver.com/hypalgesia3?Redirect=Log&logNo=70074511013

CoInitialize : http://msdn.microsoft.com/en-us/library/ms678543(VS.85).aspx

CoInitializeEx :  http://msdn.microsoft.com/en-us/library/ms695279(VS.85).aspx

COINIT Enumeration : http://msdn.microsoft.com/en-us/library/ms678505(VS.85).aspx


Peek Message : http://msdn.microsoft.com/en-us/library/ms644943(VS.85).aspx 

Send Message : http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx


STA : single threaded apartment

MTA : multi  threaded apartment


STA의 경우 :

thread A가 objects들을 생성한다.

다른 thread들이 이 object들의 method를 호출하면, 이 모든 것들은 thread A 안에서, serialization이 되어서 동작을 한다.

즉, 외부의 모든 call들은 message queue로 들어오고, 따라서 자연스럽게 serialization이 된다.

따라서 object 코드를 작성할 때, 단일 쓰레드에서 동작한다고 가정하고 코드를 작성하면 된다.


MTA의 경우 :

CoInitializeEx에 COINIT_MULTITHREADED값을 주어서, COM library를 initialization을 하면 된다.

다른 thread들이 이 object들의 method들을 호출하면, 이 method들은 다른 thread들 내부에서 실행이 되는것 같다.

특정 method, 또는 특정 object가 동시에 여러 thread들로 부터 호출이 될 수 있으므로,

object의 code 내에서 synchronization (critical section, semaphore, mutex)을 구현해야 한다.

특정 thread data를 object 내부에 저장을 할 수 없다.(왜냐하면, object는 자신을 호출한 thread의 수명을 제어하지 않기 때문이다.)

(특정 thread의 정보를 저장하고 싶다면, Thread Local Storage를 이용하라)


[출처] STA와 MTA의 개념|작성자 hypalgesia3

AND