gpt4 book ai didi

multithreading - FreeThreadedDOMDocument,Neutral Apartments和Free-threaded Marshaler

转载 作者:行者123 更新时间:2023-12-03 13:19:23 43 4
gpt4 key购买 nike

正如MSDN所述:

If you are writing a single threaded application (or a multi-threaded application where only one thread accesses a DOM at one time), use the rental threaded model (Msxml2.DOMDocument.3.0 or Msxml2.DOMDocument.6.0). If you are writing an application where multiple threads access will simultaneously access a DOM, use the free threaded model (Msxml2.FreeThreadedDOMDocument.3.0 or Msxml2.FreeThreadedDOMDocument.6.0).



FreeThreadedDOMDocument,中性公寓和自由线程编码(marshal)处理程序之间是否有任何联系?我查看了OleView,发现FreeThreadedDOMDocument线程模型是Both。据我了解,自由线程编码(marshal)处理程序支持中性单元对象。这是否意味着FreeThreadedDOMDocument不使用自由线程编码(marshal)处理程序,它被称为有点混淆自由线程?

标记为Free,Both或Neutral的COM类之间的实现区别是什么?据我了解,它们都必须是线程安全的,为什么会有区别呢? Neutral应该支持自由线程的编码(marshal)拆封器是否正确?

最佳答案

这里有多个问题。

TL; DR:

中性物体:

  • 与STA和MTA对象
  • 相比,减少了进程内编码(marshal)处理
  • 避免线程切换
  • 接口(interface)指针会自动编码(marshal)
  • 只要有一个活着的中性物体,中性公寓就可以居住
  • 必须准备好run under any kind of thread,使用COM实用程序函数等待或根据线程类型
  • 选择要使用的Win32等待函数

    自由线程对象:
  • 几乎不进行进程内编码(marshal)处理
  • 避免线程切换
  • 接口(interface)指针是而不是自动编码(marshal)的
  • 生命周期与激活公寓
  • 相关
  • 必须准备好run under any kind of thread,使用COM实用程序函数等待或根据线程类型
  • 选择要使用的Win32等待函数

    Is there any connection between FreeThreadedDOMDocument, neutral apartments and free-threaded marshaler?



    TL; DR: FreeThreadedDOMDocument的线程模型是“Both”,因此它与激活(创建)它的单元相关联。它聚合了自由线程编码(marshal)处理程序,因此它是一个自由线程对象。
    FreeThreadedDOMDocument是一个COM类,其对象聚合 free threaded marshalerWhat this marshaler does用于在处理过程中进行编码(marshal)处理时提供原始指针(即 IMarshal::MarshalInterface 设置为 dwDestContext there were already free threaded objects)。

    我将使用自由线程对象的定义作为聚合自由线程编码(marshal)处理程序的对象。

    在Windows 2000之前,应将自由线程对象的线程模型指定为“Neutral”或“Both”,以便可以在任何线程中创建和使用它,从而避免上下文切换。

    如果将其线程模型指定为“两者”,则对象的生存期将与创建它的单元绑定(bind)在一起。例如,如果STA线程终止,则在该单元内创建的所有空闲线程对象将被销毁或不再有效。

    As far as I understand neutral apartment objects are supported with a free-threaded marshaler.



    不,中立对象的代理要比其他进程内代理轻一些,因为它仅设置COM上下文,但绝不会引起完全编码(marshal)处理,并且可以避免线程切换。

    Does it mean that FreeThreadedDOMDocument doesn't use a free-threaded marshaler and it is called a bit confusing as free-threaded?



    不, MSHCTX_INPROC确实使用了自由线程编码(marshal)处理程序。

    从历史上看, another answer在Microsoft之前为它们提供了自己的支持(由于流行,并且可能是因为那里的大多数免费线程化编码(marshal)机都是片状的),而Neutral公寓仅出现在Windows 2000中。

    这样, FreeThreadedDOMDocument实例是自由线程的,因为它们聚合了自由线程的编码(marshal)处理程序,并且每个实例的生命周期都与创建它的单元绑定(bind)在一起。通常,影响不大,但带有作为STA线程的线程池,这种影响会更频繁地观察到,因为STA在拥有线程终止(正常或回收资源)并被创建时来来往往。例如,经典ASP默认情况下使用STA线程。

    PS:我在 that are not related中提到了以下主题,但我相信内容也有所不同,因为问题也有所不同。

    这是当前的线程模型值:
  • 无:使用主要STA
  • “公寓”:使用任何STA,即,如果当前公寓是STA或STA上的NA,请使用当前STA,否则请使用主机STA(稍后会详细介绍)
  • “免费”:使用MTA
  • “两者”:使用当前的公寓
  • “中立”:使用NA

  • 对于不存在的任何公寓,COM会根据需要创建它。

    这里有几个特点:
  • 要使用主STA,您必须提及任何线程模型,而不要提及更明智的事情,例如“Main”
  • 如今,除“Neutral”以外的所有名称都没有意义:
  • “公寓”感觉就像当前的公寓,但不是
  • “自由”感觉就像是自由线程对象,但不是
  • “两者”都使您认为只有2种公寓类型,但有3种:STA,MTA和NA
  • 实际上,从Windows 8开始,就有ASTA,它是为GUI创建的STA的一种变体,在拨出电话时,它丢弃拨入的电话message filter,从而避免了重入bug的巨大来源
  • 您可以使用host STA and host MTA
  • 来使常规STA表现得像这样

    主STA是第一个创建的STA。仅对于具有未指定线程模型的类才有意义。

    可以有几个STA,但是最多有一个MTA和一个NA。

    尽管有 Activity 的MTA,但未为COM初始化的任何线程如果不调用 FreeThreadedDOMDocument,则将隐式包含在MTA中,但它也完全不影响MTA的生存期,这意味着在使用该线程时可能会破坏MTA。它。由于几乎没有记录并且几乎不可靠,因此您不应该依赖于此。

    隐式创建的公寓称为 run under any apartment。您无法控制它们(除非在该公寓中通过 CoInitializeEx(NULL, COINIT_MULTITHREADED)作弊;请注意:实际上不要这样做)。实际上,如果您在STA之外或在STA之上运行的NA之外激活“Apartment”对象,则它将在主机STA中被激活。为了进一步的混淆,如果主机STA是要初始化的第一个STA,则这也可能是主STA。

    支持宿主单元的所有COM线程都是后台线程,因此它们不会阻止您的应用程序退出。

    除了在激活中立对象时创建NA,您无法控制NA。您不能直接输入它,但是可以使用在中性单元上下文中运行回调的方法创建自己的中性对象。该回调可以是自由线程对象。

    What is the implementation difference between COM classes that marked as Free, Both or Neutral?



    套间被声明为“免费”的COM类将导致属于MTA的对象。这样的对象可能假定它们运行的​​线程不必泵送窗口消息。本质上,它们可能会阻塞。

    必须为 which kind of apartment was active准备自由线程对象和中性对象。对于自由线程对象,原因显而易见:它绕过了任何上下文编码(marshal)处理,因此方法可以在任何线程中执行。对于中性对象,存在 CoUninitialize (通过 CoGetApartmentType )的区别。

    无论哪种情况,都应使用COM的实用程序功能,例如 CoWaitForMultipleHandles 而不是 WaitForMultipleHandles [ Ex ],这在STA中会阻塞并且是 Not Acceptable ,或者是 MsgWaitForMultipleHandles [ Global Interface Table Ex,它访问窗口消息队列,可能是隐式创建,并且通常是 Not Acceptable 在MTA中。

    您可以自己检查公寓类型,并选择使用适当的Win32等待功能或使用轮询策略来等待并在STA中发送带有超时的消息,以防您正在等待句柄以外的其他内容或需要具体的等待逻辑。

    自由线程对象和中性对象之间最显着的区别是编码(marshal)其他COM对象。

    使用中性对象时,传入和传出的接口(interface)指针会自动编码(marshal)。例如,您可以将传入的接口(interface)指针存储在字段中。

    使用自由线程对象时,传入和传出的接口(interface)指针完全是 而不是,这意味着您要么获得指向同一单元中对象的原始指针,要么获得指向其他单元中对象的代理。这些代理也与当前公寓相关。

    例如,传入的原始指针表示您正在获取属于当前单元的对象,因此如果要存储对该对象的引用,则必须将其编码(marshal)。

    传入代理意味着您正在获取另一个单元中对象的代理,但是此代理与当前单元绑定(bind)在一起。您也不能存储此代理。具体来说,尽管有标准的代理/ stub 的公寓验证,但STA代理可能仍具有线程关联性。您也必须将其编码。但是不用担心,编码(marshal)代理不会堆叠编码(marshal)。当您再次解码时,您将获得对象的代理,而不是代理的代理。

    当空闲线程对象必须存储接口(interface)指针时,它必须始终通过手动编码(marshal)处理,并且当它必须从此接口(interface)指针中调用方法时,它必须通过手动解封存储。

    通常,将ojit_a(GIT;另一个误导性名称,它实际上是一个进程内表)用于此目的。

    As far as I understand they all must be thread-safe, why is the difference?



    关于线程安全,没有区别。

    但是,正如我在上一个问题中所解释的那样,存储接口(interface)指针时存在巨大差异,并且在对象激活和生存期方面存在细微差异。

    Is it correct that Neutral should support a free-threaded marshaler?



    自由线程编码(marshal)拆收器有效地忽略了该单元,因此正确执行,同步和/或锁定是方法的责任。因此,这两个单元都不必须支持自由线程编码(marshal)处理程序,它是必须支持每个单元的自由线程对象。

    可以使用任何线程模型(包括“中性”)将对象中的自由线程编码(marshal)拆收器聚合在一起。

    如果您发现中性公寓编码(marshal)拆收器设置的上下文在某种程度上是一个瓶颈,那么您可以考虑使用自由线程编码(marshal)拆封器,但以手动编码(marshal)存储的接口(interface)指针为代价。如果没有,请使用中性公寓。

    关于multithreading - FreeThreadedDOMDocument,Neutral Apartments和Free-threaded Marshaler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38505280/

    43 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com