我有一个COM组件,它在COM服务中实例化(此.exe正在运行)。
我有十个客户。每个客户端从ROT获取一个接口(IXyz)指针并同时调用方法IXyz :: abc()。
从我的踪迹中我看到IXyz :: abc()同时被调用了10次,但是在10个不同的线程中。
谁在创建这10个帖子?
答案 0 :(得分:2)
如果你考虑它,COM行为是有道理的。代码在服务进程内执行。如果您将类标记为在单线程单元中运行,则一次只执行一个线程。并发调用堆叠在消息qeueu中,一次执行一个。如果指定了多线程单元,则代码可以同时执行。为了在运行过程中实现这一点,需要启动多个线程来实现此行为。
如果您想避免并发问题,则需要将您的类放入dll中。然后你仍然有多个线程,但每个线程都在调用过程中执行,所以你不必担心状态。
没有线程,没有办法同时执行任何代码块。即使你在单独的进程中执行,仍然涉及多个线程,它们只是被进程边界分隔。
我只是为了这个目标,因为我曾经为一家公司工作过,而这家公司却无法理解这一点。 :-)他们认为他们可以通过在单独的进程中执行并使用共享内存(内存映射文件)来避免线程问题!当他们的代码在单个CPU上运行并且他们添加了一个“修复”应用程序来修复不一致时,这种方法很有效。在最后一次安装时,他们转移到多个CPU,一切都真的崩溃了。然后我离开了,结束了。
答案 1 :(得分:0)
COM子系统就是这样做的。它创建了一个单独的线程来处理同时调用的不同调用。如果组件是MTA,则并行执行请求,如果是STA,则一次执行一个以防止共享变量损坏。