进程外COM服务器 - 函数调用和线程

3
当您拥有一个独立进程的COM服务器并且从客户端中的线程X调用此服务器内的函数时,该函数是在当前执行的线程上执行还是在其主线程上执行?
它将在当前线程上执行。
3个回答

2
普通的COM公寓线程规则适用。如果对象是由客户端在单线程公寓中创建的,则您的客户端线程需要使用一个编组的接口指针,否则会出现RPC_E_WRONG_THREAD错误。实际的方法调用将在服务器上的STA线程中执行,它需要为此泵送消息循环。执行是串行化的,不需要锁定。
如果它位于MTA公寓中,则方法调用将在任意的RPC工作线程上执行。您需要采取通常的线程预防措施。

嗯,这个问题涉及到一个 out-of-proc 服务器,因此始终会发生封送。我认为你的答案更与 in-proc 服务器相关,尽管客户端和服务器的线程配置需要相同才能防止封送。 - Timores

1

线程不会从进程跳到另一个进程。

在COM服务器内部,COM会监听传入的方法调用,并拥有一个线程池(仅限于该进程)来处理请求。


那么,通信服务器中的代码是否需要由开发人员进行线程安全处理,还是系统已经处理好了? - Tony The Lion
在您的COM服务器中,这是可配置的:你可以要求COM序列化所有请求,或者告诉COM你会处理多线程(例如使用锁)并且请求不会被序列化。 - Timores

1

请参阅对象间通信, 代理存根

客户端总是在某个进程对象中调用接口方法。如果实际对象是本地或远程的,则调用将被传递到代理对象,然后代理对象将对实际对象进行远程过程调用。
那么实际执行哪种方法呢?答案是每当有一个跨进程接口调用时,每个接口方法都由代理对象实现。代理对象始终是一个代表被调用对象的进程内对象。该代理对象知道实际对象正在本地或远程服务器上运行。
代理对象将函数参数打包成一些数据包,并生成一个 RPC 调用以调用本地或远程对象。该数据包由服务器进程中的存根对象在本地或远程计算机上拾取,该存根对象解包参数并调用方法的真正实现。当该函数返回时,存根将任何输出参数和返回值打包并将其发送回代理,代理解包它们并将它们返回给原始客户端。
因此,客户端和服务器始终像一切都在进程内部一样交谈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接