source

STA와 MTA에 대해 설명해 주시겠습니까?

factcode 2023. 5. 24. 22:27
반응형

STA와 MTA에 대해 설명해 주시겠습니까?

당신은 STA와 MTA를 당신의 말로 설명할 수 있습니까?

또한 아파트 스레드는 무엇이며 COM에만 해당됩니까?만약 그렇다면, 왜?

COM 스레드 모델은 초기화된 COM 개체의 실행 컨텍스트가 단일 스레드(싱글 스레드 아파트) 또는 여러 스레드(멀티 스레드 아파트)와 연결되는 "아파트" 모델이라고 합니다.이 모델에서는 아파트에서 초기화된 COM 개체가 런타임 동안 해당 아파트의 일부입니다.

STA 모델은 스레드 세이프가 아닌 COM 개체에 사용됩니다.즉, 자체 동기화를 처리하지 않습니다.일반적으로 UI 구성 요소를 사용합니다.따라서 다른 스레드가 개체와 상호 작용해야 하는 경우(예: 양식에서 버튼을 누르는 경우) 메시지는 STA 스레드에 마샬링됩니다.윈도우 폼 메시지 펌핑 시스템이 이에 대한 예입니다.

COM 개체가 자체 동기화를 처리할 수 있는 경우 MTA 모델을 사용하여 여러 스레드가 호출 없이 개체와 상호 작용할 수 있습니다.

개체에 대한 호출을 처리하는 방법과 개체에 필요한 보호 수준에 따라 달라집니다.COM 개체는 런타임에 여러 스레드에 의해 동시에 호출되지 않도록 보호하도록 요청할 수 있습니다. 그렇지 않은 개체는 잠재적으로 다른 스레드에서 동시에 호출될 수 있으므로 자체 데이터를 보호해야 합니다.

또한 사용자 인터페이스 스레드에서 호출이 발생한 경우 런타임에서 COM 개체 호출이 사용자 인터페이스를 차단하지 않도록 해야 합니다.

아파트는 물건들이 살기 위한 장소이고, 그들은 하나 이상의 실을 포함합니다.아파트는 전화가 왔을 때 일어나는 일을 정의합니다.아파트의 객체에 대한 호출은 해당 아파트의 모든 스레드에서 수신되고 처리됩니다. 단, 올바른 아파트에 이미 있는 스레드에 의한 호출은 자체적으로 처리됩니다(즉, 객체에 대한 직접 호출).

스레드는 단일 스레드 아파트(이 경우 해당 아파트의 유일한 스레드) 또는 다중 스레드 아파트에 있을 수 있습니다.스레드가 해당 스레드에 대해 COM을 초기화하는 시기를 지정합니다.

STA는 주로 특정 스레드에 연결된 사용자 인터페이스와의 호환성을 위한 것입니다.STA는 숨겨진 창에 대한 창 메시지를 수신하여 처리할 호출 알림을 수신합니다. 아웃바운드 호출을 할 때 다른 창 메시지가 처리되지 않도록 모달 메시지 루프를 시작합니다.응용프로그램이 다른 메시지에 응답할 수 있도록 호출할 메시지 필터를 지정할 수 있습니다.

반대로 모든 MTA 스레드는 프로세스에 대해 단일 MTA를 공유합니다.사용 가능한 스레드가 없는 경우 COM은 새 작업자 스레드를 시작하여 수신 호출을 처리할 수 있습니다.아웃바운드 호출을 수행하는 스레드는 단순히 차단합니다.

간단히 설명하기 위해 DLL에 구현된 개체만 고려할 것입니다. DLL은 다음을 설정하여 레지스트리에서 지원하는 내용을 표시합니다.ThreadingModel클래스 키 값입니다.네 가지 옵션이 있습니다.

  • 주 스레드(ThreadingModel값이 없습니다.개체는 호스트의 기본 UI 스레드에 생성되고 모든 호출은 해당 스레드로 마샬링됩니다.클래스 팩토리는 해당 스레드에서만 호출됩니다.
  • Apartment이것은 클래스가 모든 단일 스레드 모드 스레드에서 실행될 수 있음을 나타냅니다.이 스레드를 생성하는 스레드가 STA 스레드인 경우 객체는 해당 스레드에서 실행되고, 그렇지 않으면 기본 STA에서 생성됩니다. 주 STA가 없으면 해당 스레드에 대한 STA 스레드가 생성됩니다. (이는 아파트 객체를 생성하는 MTA 스레드가 모든 호출을 다른 스레드로 마샬링한다는 것을 의미합니다.)클래스 팩토리는 여러 STA 스레드에서 동시에 호출될 수 있으므로 이로부터 내부 데이터를 보호해야 합니다.
  • FreeMTA에서 실행되도록 설계된 클래스를 나타냅니다.STA 스레드에 의해 생성된 경우에도 항상 MTA에 로드되며, 이는 다시 STA 스레드의 호출이 마샬링됨을 의미합니다.그 이유는Free객체는 일반적으로 차단할 수 있을 것으로 예상하여 작성됩니다.
  • Both이 수업들은 신축성이 있고 그들이 어떤 아파트에서 만들어졌든 간에 부담이 수업들은그러나 두 가지 요구 사항에 모두 적합하도록 작성해야 합니다. MTA에 로드된 경우 동시 호출에 대해 내부 상태를 보호해야 하지만 STA에 로드된 경우에는 차단해서는 안 됩니다.

.NET Framework에서는 기본적으로 다음을 사용합니다.[STAThread]UI를 생성하는 모든 스레드에서.작업자 스레드는 사용하지 않을 경우 MTA를 사용해야 합니다.Apartment-COM 구성 요소를 표시합니다. 이 경우 동일한 구성 요소가 여러 스레드에서 호출되는 경우(각 스레드가 구성 요소를 차례로 기다려야 하므로) STA를 사용하여 마샬링 오버헤드 및 확장성 문제를 방지합니다.구성 요소가 STA에 있든 MTA에 있든 스레드별로 별도의 COM 개체를 사용하는 것이 훨씬 쉽습니다.

나는 기존의 설명이 너무 터무니없다고 생각합니다.간단한 영어로 설명해 드리겠습니다.

STA: 스레드가 STA로 설정된 COM 개체를 만든 경우(CoCreateXXX를 호출할 때 COM 개체를 STA 모드로 설정하는 플래그를 전달할 수 있음), 이 스레드만 이 COM 개체에 액세스할 수 있습니다(STA는 단일 스레드 아파트를 의미함).이 COM 개체에서 메서드를 호출하려는 다른 스레드가 후드 아래에 있으며 이 스레드는 자동으로 COM 개체를 생성(소유)하는 스레드에 메시지를 전달합니다.이는 UI 컨트롤을 만든 스레드만 직접 액세스할 수 있다는 사실과 매우 유사합니다.그리고 이 메커니즘은 복잡한 잠금/잠금 해제 작업을 방지하기 위한 것입니다.

MTA: 스레드가 MTA로 설정된 COM 개체를 생성하면 거의 모든 스레드가 메서드를 직접 호출할 수 있습니다.

그것이 거의 요점입니다.기술적으로 'STA' 단락과 같이 제가 언급하지 않은 몇 가지 세부 사항이 있지만, 작성자 스레드 자체는 STA여야 합니다.하지만 STA/MTA/NA를 이해하기 위해 알아야 할 것은 이것뿐입니다.

STA(Single Threaded Apartment)는 기본적으로 한 번에 하나의 스레드만 코드와 상호 작용한다는 개념입니다.아파트에 대한 통화는 창 메시지(보이지 않는 창 사용)를 통해 마샬링됩니다.이렇게 하면 통화를 대기열에 넣고 작업이 완료될 때까지 기다릴 수 있습니다.

MTA(Multi Threaded Apartment)는 여러 스레드를 동시에 운영할 수 있는 곳으로, 스레드 보안을 처리할 책임은 개발자로서 귀하에게 있습니다.

COM에서 스레딩 모델에 대해 더 많은 것을 배울 수 있지만, 모델이 무엇인지 이해하는 데 어려움이 있다면 대부분의 COM 개체가 STA이기 때문에 STA가 무엇이고 어떻게 작동하는지 이해하는 것이 가장 좋은 시작점이라고 말씀드리고 싶습니다.

아파트 스레드, 스레드가 사용 중인 개체와 동일한 아파트에 있으면 아파트 스레드입니다.이것은 단지 COM 개념일 뿐이라고 생각합니다. 왜냐하면 그것들이 상호 작용하는 객체와 스레드에 대해 이야기하는 방식이기 때문입니다.

COM 또는 OLE 컨트롤을 호스트하는 각 EXE는 해당 아파트 상태를 정의합니다.아파트 상태는 기본적으로 STA(대부분의 프로그램에서 STA)입니다.

STA - 필요에 따라 모든 OLE 컨트롤은 STA에 있어야 합니다. STA는 사용자의 COM 개체가 항상 UI 스레드에서 조작되어야 하며 다른 스레드로 전달될 수 없음을 의미합니다(MFC의 UI 요소와 동일).그러나 프로그램에는 여전히 많은 스레드가 있을 수 있습니다.

MTA - 프로그램의 모든 스레드에서 COM 개체를 조작할 수 있습니다.

제가 알기로는 '아파트'는 멀티스레딩 문제로부터 COM 객체를 보호하기 위해 사용되는 것으로 알고 있습니다.

COM 개체가 스레드 세이프가 아닌 경우 STA 개체로 선언해야 합니다.그런 다음 작성한 스레드만 액세스할 수 있습니다.생성 스레드는 자체를 STA 스레드로 선언해야 합니다.후드 아래에서 스레드는 STA 정보를 TLS(Thread Local Storage)에 저장합니다.우리는 이 동작을 스레드가 STA 아파트로 들어가는 것이라고 부릅니다.다른 스레드가 이 COM 개체에 액세스하려는 경우 생성 스레드에 대한 액세스 권한을 표시해야 합니다.기본적으로 작성 스레드는 인바운드 호출을 처리하기 위해 메시지 메커니즘을 사용합니다.

COM 개체가 스레드 안전한 경우 MTA 개체로 선언해야 합니다.MTA 개체는 멀티 스레드로 액세스할 수 있습니다.

COM 개체 dll을 호출하는 코드(예: 독점 데이터 파일 읽기)는 사용자 인터페이스에서 잘 작동할 수 있지만 서비스에서 불가사의하게 중단됩니다.그 이유는 현재.Net 2.0 사용자 인터페이스는 STA(스레드 세이프)를 가정하고 서비스는 MTA(이전에는 서비스가 STA)를 가정했습니다.서비스의 모든 COM 호출에 대해 STA 스레드를 생성해야 하는 경우 상당한 오버헤드가 발생할 수 있습니다.

이 기사는 STA와 MTA를 매우 명확하게 설명합니다.

IMT2000 3GPP - COM 아파트 이해하기, Part I
IMT2000 3GPP - COM 아파트 이해, Part II

아파트가 무엇인지에 대한 요점:

  • 아파트는 동시성 경계이며, 호환되지 않는 스레드 특성을 가진 COM 클라이언트와 COM 개체를 구분하는 객체와 클라이언트 스레드 주위에 그려진 가상 상자입니다.
  • COM을 사용하는 모든 스레드와 이러한 스레드가 생성하는 모든 개체는 아파트에 할당됩니다.
  • 스레드가 COM을 호출할 때CoInitialize또는CoInitializeEx함수, 그 스레드는 아파트에 배치됩니다.그리고 물건이 만들어지면, 그것도 아파트에 놓이게 됩니다.
  • COM은 새 아파트를 만들 때마다 힙에 아파트 객체를 할당하고 아파트 ID, 아파트 유형 등 중요한 정보로 초기화합니다.아파트에 스레드를 할당할 때 COM은 해당 아파트 개체의 주소를 TLS(스레드 로컬 스토리지)에 기록합니다.

참고 사항:일부 PowerShell 2.0 스냅인을 사용하는 경우 이 스냅인을 사용하려면 -MTA 옵션이 포함된 PowerShell 버전 3 이상을 시작해야 합니다.PowerShell 2 아파트 모델은 MTA이지만 이후 버전에서는 STA를 기본값으로 사용합니다.또 다른 요점은 쓴맛입니다.아파트의 일반 통화는 마샬링(직통 통화)되지 않으므로, 발신자가 x64인 경우 발신자도 x64여야 합니다.이 문제를 해결하는 유일한 방법은 RPC(원격 프로시저 호출)를 사용하는 것입니다. RPC는 엄청난 오버헤드를 추가합니다(스냅인 DLL 및 쿼리 결과를 로드하기 위해 새로운 32비트 프로세스를 생성합니다).개발자의 경우: 항상 게시 유형 라이브러리 - COM 개체 검색 및 사용을 훨씬 쉽게 합니다!모든 인터페이스는 공개적이고 고유해야 합니다. 구현은 독점적이거나 오픈 소스일 수 있습니다.

다른 상황

예:

 IStorage_vtbl** reference; // you got it by some means of factory
 
 
 public unsafe int OpenStorage(char* pwcsName, IStorage pstgPriority, uint grfMode, char** snbExclude, uint reserved, IStorage* ppstg)
 {
     IStorage_vtbl** @this = (IStorage_vtbl**)reference;
     IStorage_vtbl* vtbl = *@this;
     if (vtbl == null)
         throw new InvalidComObjectException();
     Delegate genericDelegate = Marshal.GetDelegateForFunctionPointer(vtbl->method_6, typeof(delegate_6));
     delegate_6 method = (delegate_6)genericDelegate;
     return method(@this, pwcsName, pstgPriority, grfMode, snbExclude, reserved, ppstg);
 }
 

이 코드 조각은 COM 하위 시스템에 실제 호출을 위한 인스턴스의 'this' 포인터를 추가합니다. 그렇다면, 이 호출은 Istorage STA 또는 MTA의 열린 인스턴스에 대한 것입니까?

언급URL : https://stackoverflow.com/questions/127188/could-you-explain-sta-and-mta

반응형