[.net] STA와 MTA에 대해 설명해 주시겠습니까?



Answers

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

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

아파트 는 물건을 살 수있는 장소이며 하나 이상의 실이 있습니다. 아파트는 전화가 걸려 올 때 일어나는 일을 정의합니다. 아파트의 오브젝트에 대한 호출은 해당 아파트의 모든 스레드에서 수신되고 처리됩니다. 단, 오른쪽 아파트에 이미있는 스레드의 호출이 자동으로 처리됩니다 (즉, 오브젝트에 대한 직접 호출).

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

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

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

간단하게하기 위해 DLL에 구현 된 객체 만 고려해 볼 것입니다. DLL에 구현 된 객체는 클래스의 키에 ThreadingModel 값을 설정하여 레지스트리에서 지원하는 객체를 보급합니다. 네 가지 옵션이 있습니다.

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

.NET Framework에서 기본적으로 UI를 만드는 모든 스레드에서 [STAThread] 를 사용하십시오. 작업자 스레드는 Apartment Marked COM 구성 요소를 사용하지 않는 한 MTA를 사용해야하며,이 경우 STA를 사용하여 동일한 구성 요소가 여러 스레드에서 호출 될 경우 오버 헤드 및 확장 성 문제를 마샬링하지 않습니다 (각 스레드가 대기해야 함). 구성 요소에 대해 차례대로). 구성 요소가 STA 또는 MTA에 있는지 여부에 관계없이 스레드 당 별도의 COM 개체를 사용하면 훨씬 편리합니다.

Question

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

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




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

STA - 필요에 따라 모든 OLE 컨트롤은 STA에 있어야합니다. STA는 UI 개체에서 COM 개체를 항상 조작해야하며 MFC의 UI 요소와 마찬가지로 다른 스레드로 전달할 수 없음을 의미합니다. 그러나 프로그램에는 여전히 많은 스레드가있을 수 있습니다.

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




내 이해에 따라 '아파트'는 멀티 스레드 문제에서 COM 개체를 보호하는 데 사용됩니다.

COM 개체가 스레드로부터 안전하지 않으면 STA 개체로 선언해야합니다. 그런 다음이를 생성 한 스레드 만 액세스 할 수 있습니다. 생성 스레드는 자체를 STA 스레드로 선언해야합니다. 내부적으로 스레드는 TLS (Thread Local Storage)에 STA 정보를 저장합니다. 이 동작은 스레드가 STA 아파트에 들어가는 것으로 간주합니다. 다른 스레드가이 COM 개체에 액세스하려고하면 생성 스레드에 대한 액세스를 마샬링해야합니다. 기본적으로 생성 스레드는 메시지 메커니즘을 사용하여 인바운드 호출을 처리합니다.

COM 개체가 스레드로부터 안전하면 MTA 개체로 선언해야합니다. MTA 객체는 다중 스레드로 액세스 할 수 있습니다.




Related