2010-05-28 4 views
3

프로세스 외부 COM 서버가 있고이 서버 내부의 클라이언트에서 클라이언트 내부의 스레드 X에서 함수를 호출하면이 함수가 COM 서버에서 어떻게 실행되는지 ?Out of Process COM 서버 - 함수 호출 및 스레드

스레드가 현재 실행 중이거나 메인 스레드에 있습니까?

답변

2

일반 COM 아파트 스레딩 규칙이 준수됩니다. 개체가 STA 아파트에서 클라이언트에 의해 만들어진 경우 클라이언트 스레드는 마샬링 된 인터페이스 포인터를 사용해야하거나 RPC_E_WRONG_THREAD를 가져옵니다. 실제 메서드 호출은 해당 STA 스레드에서 서버에서 실행되며 메시지 루프를 펌핑하여 작동하도록해야합니다. 실행이 직렬화되므로 잠금이 필요하지 않습니다.

MTA 아파트에 거주하는 경우 메서드 호출은 임의의 RPC 작업자 스레드에서 실행됩니다. 그리고 일반적인 스레딩 예방 조치를 취해야합니다.

+0

흠, 질문은 out-of-proc 서버에 관한 것이므로 마샬링이 항상 발생합니다. 귀하의 대답은 클라이언트와 서버의 스레딩 구성이 마샬링을 방지하기 위해 동일해야하지만, in-proc 서버와 더 관련이 있다고 생각합니다. – Timores

1

스레드는 프로세스간에 점프하지 않습니다.

COM 서버 내부에서 COM은 들어오는 메서드 호출을 수신하고 요청을 처리 할 스레드 풀 (이 프로세스에만 해당)이 있습니다.

+0

그래서 comm 서버의 코드는 개발자가 쓰레드 세이프 (threadafe safe)로 만들거나 이미 시스템에서 처리하고 있습니까? –

+0

이것은 COM 서버에서 구성 할 수 있습니다. COM에서 모든 요청을 직렬화하도록 요청하거나 COM에서 멀티 스레딩 (예 : 잠금 사용)을 처리하고 요청이 직렬화되지 않도록 지시합니다. – Timores

1

Inter-Object Communication, ProxyStub을 참조하십시오.

클라이언트는 항상 일부 처리중인 개체에서 인터페이스 메서드를 호출합니다. 실제 개체가 로컬 또는 원격 인 경우 프록시 개체에 대한 호출이 이루어지면 실제 개체가 호출됩니다.

그래서 실제로 어떤 방법이 실행됩니까? 응답은 out-of-process 인터페이스에 호출이있을 때마다 각 인터페이스 메서드는 프록시 개체에 의해 으로 구현됩니다. 프록시 개체는 이며 항상 호출되는 개체 대신 역할을하는 in-process 개체입니다. 이 프록시 개체는 실제 개체가 로컬 또는 원격 서버에서 실행되고 있음을 알고 있습니다.

프록시 객체 일부 데이터 패킷의 패키지 가입 함수 파라미터 및 에 RPC 호출이 로컬 또는 원격 객체를 생성한다. 그 패킷 로컬 또는 의 매개 변수를 풀고 메소드의 실제 구현을 호출하는 원격 컴퓨터의 서버 프로세스에서 스텁 객체 에 의해 선택됩니다. 해당 함수가 반환되면 스텁 은 out 매개 변수와 반환 값을 패키지화하고이를 프록시로 다시 보냅니다. 프록시는이를 압축 해제하여 원래 클라이언트에 반환합니다.

따라서 클라이언트와 서버는 모든 것이 마치 in-process 인 것처럼 항상 와 대화합니다.

관련 문제