문제

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

또한 아파트 스레드는 무엇이며 COM에만 관련됩니까?그렇다면 왜 그렇습니까?

도움이 되었습니까?

해결책

COM 스레딩 모델을 "아파트"모델이라고하며, 초기화 된 COM 개체의 실행 컨텍스트는 단일 스레드 (단일 스레드 아파트) 또는 많은 스레드 (멀티 스레드 아파트)와 관련이 있습니다. 이 모델에서, 한 번 아파트에서 초기화 된 COM 객체는 런타임 기간 동안 그 아파트의 일부입니다.

STA 모델은 스레드 안전하지 않은 COM 객체에 사용됩니다. 그것은 그들이 자신의 동기화를 처리하지 않는다는 것을 의미합니다. 이것의 일반적인 사용은 UI 구성 요소입니다. 따라서 다른 스레드가 객체와 상호 작용 해야하는 경우 (예 : 양식의 버튼을 누르는 것) 메시지가 STA 스레드에 마샬링됩니다. Windows Forms Message Pumping System 이이 예입니다.

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

다른 팁

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

또한 사용자 인터페이스 스레드에서 호출이 이루어지는 경우 런타임에서는 COM 개체 호출이 사용자 인터페이스를 차단하는 것을 방지해야 합니다.

아파트 개체가 살 수 있는 장소이며 하나 이상의 스레드를 포함합니다.아파트는 전화가 걸려올 때 무슨 일이 일어나는지 정의합니다.아파트의 개체에 대한 호출은 해당 아파트의 모든 스레드에서 수신되고 처리됩니다. 단, 올바른 아파트에 이미 있는 스레드에 의한 호출은 자체적으로 처리됩니다(예:객체에 대한 직접 호출).

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

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

대조적으로 모든 MTA 스레드는 프로세스에 대해 단일 MTA를 공유합니다.COM은 사용 가능한 스레드가 없는 경우 풀 제한까지 들어오는 호출을 처리하기 위해 새 작업자 스레드를 시작할 수 있습니다.아웃바운드 호출을 하는 스레드는 단순히 차단됩니다.

단순화를 위해 DLL에서 구현된 개체만 고려하겠습니다. 이 개체는 자신이 지원하는 것을 레지스트리에 광고합니다. ThreadingModel 해당 클래스의 키 값입니다.네 가지 옵션이 있습니다:

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

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

기존의 설명도 gobbledygook을 찾습니다. 다음은 평범한 영어에 대한 내 설명입니다.

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

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

그것은 그것의 요점입니다. 기술적으로 'Sta'단락과 같이 언급하지 않은 세부 사항이 있지만 Creator Thread 자체는 STA 여야합니다. 그러나 이것은 STA/MTA/NA를 이해하기 위해 알아야 할 전부입니다.

STA (Single Threaded Apartment)는 기본적으로 하나의 스레드만이 한 번에 코드와 상호 작용한다는 개념입니다. 아파트로의 통화는 Windows 메시지 (가시가 아닌) 창을 통해 마샬링됩니다. 이를 통해 호출을 대기하고 작업이 완료되기를 기다릴 수 있습니다.

MTA (멀티 스레드 아파트)는 많은 스레드가 동시에 동시에 작동 할 수 있으며 스레드 보안을 처리하기위한 개발자로서 귀하에게 있습니다.

COM의 스레딩 모델에 대해 배우는 것이 훨씬 더 많지만, 그들이 무엇인지 이해하는 데 어려움을 겪고 있다면 STA가 무엇인지 이해하고 대부분의 COM 객체가 STA이기 때문에 가장 좋은 출발점이 될 것이라고 말할 것입니다.

아파트 실, 실이 사용중인 물체와 같은 아파트에 사는 경우 아파트 실입니다. 나는 이것이 COM 개념 일 뿐이라고 생각합니다. 왜냐하면 그것은 그들이 상호 작용하는 대상과 실에 대해 이야기하는 방법 일뿐입니다.

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

스타 - 필요에 따라 모든 올레 통제는 STA에 살아야합니다. STA는 COM-Object가 항상 UI 스레드에서 조작되어야하며 다른 스레드 (MFC의 UI 요소와 마찬가지로)로 전달할 수 없음을 의미합니다. 그러나 귀하의 프로그램에는 여전히 많은 스레드가있을 수 있습니다.

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

내 이해로, '아파트'는 COM 객체를 멀티 스레딩 문제로부터 보호하는 데 사용됩니다.

COM 객체가 스레드 안전이 아닌 경우 STA 객체로 선언해야합니다. 그런 다음 그것을 생성하는 스레드 만 액세스 할 수 있습니다. 생성 스레드는 스스로 스레드로 선언해야합니다. 후드 아래에서 스레드는 STA 정보를 TLS (스레드 로컬 스토리지)에 저장합니다. 우리는 실이 STA 아파트에 들어가는 것처럼이 행동이라고 부릅니다. 다른 스레드 가이 COM 객체에 액세스하려면 생성 스레드에 대한 액세스를 마샬링해야합니다. 기본적으로 생성 스레드는 메시지 메커니즘을 사용하여 내부 통화를 처리합니다.

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

COM Object DLL을 호출하는 코드 (예 : 독점 데이터 파일을 읽으려면)는 사용자 인터페이스에서 잘 작동하지만 서비스에서 신비하게 매달릴 수 있습니다. 그 이유는 .NET 2.0 사용자 인터페이스가 STA (Thread-Safe)를 가정하고 서비스는 MTA를 가정하고 (이전에 STA를 가정 한 서비스) 서비스의 모든 COM 호출에 대해 STA 스레드를 생성해야한다면 상당한 오버 헤드가 추가 될 수 있기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top