COM 스레드 모델

1. 개요


본고는 독서 노트로 COM 관련 서적을 참고하여 COM의 스레드 모델을 정리했다. 이는 스레드 세트, 자유 스레드, 단일 스레드 세트, 다중 스레드 세트, 열 집합 등 관련 개념을 포함한다.

2. Win32 스레드


COM은 Win32 스레드를 직접 사용하기 때문에 Win32 스레드에 대해 먼저 논의할 필요가 있습니다.Win32 시스템 스레드 자체는 하나이며, 응용 모델에 따라 작업 스레드와 UI 스레드 두 가지로 나눌 수 있습니다.
  • 작업 라인은 실행 단서로서 메시지 개념이 없으면 실행이 끝난 후에 라인이 퇴출된다.
  • UI 스레드와 작업 스레드의 가장 큰 차이점은 메시지 대기열을 포함하는 것이다. 스레드가 Win32 User나 GDI 함수를 처음 호출할 때(예를 들어 창 만들기) 운영체제가 메시지 대기열을 만들 것이다.일반적으로 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(싱글 스레드 스위트룸)

  • 하나의 프로세스에 여러 STA 스위트룸을 포함할 수 있음
  • 각 STA 세트는 유일한 라인을 포함하고 라인과 일일이 대응하는 관계를 가진다. 이 라인은 세트의 라인
  • 이다.

    MTA(멀티스레드 스위트룸)

  • MTA 스위트룸 하나
  • MTA 스위트룸에는 하나 이상의 스레드가 포함될 수 있으며 이러한 스레드는 자유 스레드
  • 4. STA 및 스위칭 스레드


    먼저 Win32 프로그램에서 UI 스레드와 창으로 만든 창을 고려합니다. 사용자가 이 창에 메시지를 보낼 때, Windows는 이 스레드의 메시지 대기열에 메시지를 넣고, 스레드는 이 메시지를 꺼내서 지정한 창으로 나누어 줍니다. 창 프로세스를 호출하여 처리합니다. 이 작업은 창을 만드는 스레드에서 직렬적으로 실행되며, 사용자는 동기화 문제를 고려할 필요가 없습니다.
    이와 같이, 플러그인은 생성된 COM 대상을 가지고 있으며, 메시지를 동기화하고 나누어 주는 숨겨진 창을 만들 것입니다.다른 스레드의 코드는 대상의 구성원 함수를 직접 호출할 수 없습니다. 프록시/캐시 루트를 통해서만 이 대상을 호출할 수 있습니다. 이 호출은 메시지 형식으로 스레드에 전송되고, 스레드는 메시지 순환을 통해 관련 제어 함수를 호출하기 때문에 이 호출은 자동으로 동기화됩니다.
    STA 작성 단계
  • 스레드에서 CoInitializeEx(NULL, COINIT APARTMENTTHREADED) 또는 CoInitialize(NULL)를 호출합니다.COM은 STA 스위트룸을 만들고 현재 스레드와 연결합니다. 이 스레드는 스위트룸 스레드가 됩니다.
  • 라인에 메시지 펌프가 포함되어야 합니다. 그렇지 않으면 다른 라인에서 호출된 것은 영원히 되돌아올 수 없습니다.
  • 스레드가 끝나기 전에 CoUninitialize를 호출하여 스위트룸을 끝냅니다.

  • 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원리와 응용》---반애민 저서

    좋은 웹페이지 즐겨찾기