COM 스레드 모델
1. 개요
본고는 독서 노트로 COM 관련 서적을 참고하여 COM의 스레드 모델을 정리했다. 이는 스레드 세트, 자유 스레드, 단일 스레드 세트, 다중 스레드 세트, 열 집합 등 관련 개념을 포함한다.
2. Win32 스레드
COM은 Win32 스레드를 직접 사용하기 때문에 Win32 스레드에 대해 먼저 논의할 필요가 있습니다.Win32 시스템 스레드 자체는 하나이며, 응용 모델에 따라 작업 스레드와 UI 스레드 두 가지로 나눌 수 있습니다.
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
COM에서 사용하는 스레드 유형은 Win32의 두 스레드 유형과 같고 UI 스레드와 대응하는 스레드는 크로스 스레드이며, 주 함수도 메시지 순환이 있으며, 작업 스레드와 대응하는 것은 자유 스레드입니다.
3. 스위트룸 개념
스위트룸은 다중 스레드의 COM 구성 요소 액세스를 제어하는 논리적 개념입니다.스위트룸을 COM 스레드 모델의 실현자로 보고 COM 대상이 실행하는 스레드 환경을 스케줄링, 전환하여 COM 대상의 다중 스레드 호출이 정상적으로 작동하도록 보장할 수 있다.프로세스 중의COM 대상을 몇 개의 그룹으로 나눌 수 있으며, 각 그룹은 하나의 세트이다.이 칸막이에 속하는 라인은 대상을 직접 호출할 수 있으며, 이 칸막이에 속하지 않는 라인은 에이전트를 통해 대상을 호출할 수 있다.실현에 있어 스위트룸은 스레드 TLS에 저장된 데이터 구조로 이 구조를 빌려 스위트룸과 스레드 사이에 관련을 맺는다.
세 가지 스위트룸이 있는데 그것이 바로 STA, MTA, TNA이다. 그러나 TNA에 대해 익숙하지 않기 때문에 여기는 단선정 스위트룸과 다선정 스위트룸만 논의한다.
STA(싱글 스레드 스위트룸)
MTA(멀티스레드 스위트룸)
4. STA 및 스위칭 스레드
먼저 Win32 프로그램에서 UI 스레드와 창으로 만든 창을 고려합니다. 사용자가 이 창에 메시지를 보낼 때, Windows는 이 스레드의 메시지 대기열에 메시지를 넣고, 스레드는 이 메시지를 꺼내서 지정한 창으로 나누어 줍니다. 창 프로세스를 호출하여 처리합니다. 이 작업은 창을 만드는 스레드에서 직렬적으로 실행되며, 사용자는 동기화 문제를 고려할 필요가 없습니다.
이와 같이, 플러그인은 생성된 COM 대상을 가지고 있으며, 메시지를 동기화하고 나누어 주는 숨겨진 창을 만들 것입니다.다른 스레드의 코드는 대상의 구성원 함수를 직접 호출할 수 없습니다. 프록시/캐시 루트를 통해서만 이 대상을 호출할 수 있습니다. 이 호출은 메시지 형식으로 스레드에 전송되고, 스레드는 메시지 순환을 통해 관련 제어 함수를 호출하기 때문에 이 호출은 자동으로 동기화됩니다.
STA 작성 단계
5. MTA 및 자유 스레드
한 프로세스에 최대 하나의 MTA만 있을 수 있다. 첫 번째로 어떤 라인에서CoInitializeEx(NULL, COINIT MULTITHREADED)를 호출할 때 MTA를 만들고 현재 라인을 자신과 연결시킨다. 라인은 자유 라인으로 표시된다.다른 스레드가 다시 호출될 때, 이 MTA는 이 스레드들을 연결시켜 자유 스레드로 표시합니다.
하나의 MTA로 여러 스레드를 연결할 수 있습니다.모든 연결 루틴은 스위트룸의 COM 객체를 호출할 수 있습니다.이것은 동기화 문제와 관련이 있기 때문에 구성 요소 작성자가 스스로 해결해야 한다.MTA 스레드가 만들어진 대상은 특정한 스레드에서 생존하지 않고 MTA에서 생존한다.
6. 세트 간 전달 커넥터 포인터
세트 간에 원래 인터페이스 포인터를 직접 전달할 수 없으며, 열 집합 (또는 봉송, Marshaling) 과 산집을 통과해야 한다.Windows NT4.0 이상 버전은CoMarshalInterThreadInterfaceInstream과CoGetInterfaceAndReleasesStream이라는 API 함수를 제공하여 이 기능을 완성합니다.
이 함수의 실현은 비교적 스마트한 것으로 집합이 필요 없을 때 집합하지 않는다. 예를 들어 MTA의 서로 다른 라인에서 인터페이스 바늘을 전달하기 때문에 온라인 인터페이스 바늘을 전달할 때 언제든지 이 함수를 호출하는 것이 좋다.
7. COM 구성 요소 호출
프로세스 간에 어떤 라인 형식이든proxy/stub가 필요합니다 proxy/stub은 같은 프로세스의 다른 STA 간에도 필요합니다. STA 내부에서 한 대상이 다른 대상을 호출하는 방법은proxy/stub가 필요하지 않습니다 MTA에서 STA를 호출하려면 proxy/stub이 필요합니다. MTA 내부에서 대상과 호출자 사이의 호출은proxy/stub가 필요하지 않으며 호출은 클라이언트 라인에서 직접 실행됩니다 STA 또는 다른 프로세스에서 MTA를 호출하려면 proxy/stub가 필요하며 RPC 스레드에서 호출해야 합니다
8. 참고서목
----Dale Rogerson 저서
《COM원리와 응용》---반애민 저서
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 라인과synchronized 키워드를 깊이 있게 설명하다루틴이야말로 프로그램의 집행자이고 여러 루틴 간에 프로세스 중의 자원을 공유하고 있다.하나의 cpu는 동시에 하나의 라인만 실행할 수 있으며, 모든 라인은 하나의 타임 슬라이스가 있으며, 타임 슬라이스가 다 사용하면...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.