首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微软的类比(STA,MTA):需要帮助理解它

微软的类比(STA,MTA):需要帮助理解它
EN

Stack Overflow用户
提问于 2012-01-26 06:48:33
回答 2查看 3.2K关注 0票数 2

我读过很多关于微软的线程公寓模型的文章,但是我仍然很难将它可视化。

微软使用的类比是居住在公寓里的生物。因此,对于STA,请考虑以下几点(我知道这有点傻)。

  1. 假设线程= person和COMObject =细菌。人住在公寓里,细菌住在人的体内。因此,在STA-Land中,线程驻留在STA中,而COMObject驻留在线程中,因此为了与COMObject交互,必须在COMObject的线程上运行代码。
  2. 假设线程= person和COMObject = cat。人住在公寓里,猫和人住在公寓里。所以在STA-Land中,线程和COMObject处于相同的层次.

Q1。以上哪种类比是正确的,或者如果两者都不正确,你会如何描述STA?

Q2。你会怎么描述MTA?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-26 07:09:23

我不喜欢这些类比。他们很困惑。

你创造了一间公寓。

如果是STA,则公寓中只有一个线程,因此该公寓中的所有对象都将在该单线程上执行(因此在该公寓中的对象中没有并发执行)

如果是MTA,则该单元中可以有多个线程。因此,如果需要,MTA中的对象需要显式地实现同步。

一个物体住在一个公寓里。同一间公寓里可以有多个物体。

在这里读得很好

票数 3
EN

Stack Overflow用户

发布于 2012-01-26 11:14:43

这不是一个很好的术语。它实际上描述了线程行为。线程告诉COM它在CoInitializeEx()调用中的行为,在STA和MTA之间进行选择。通过使用STA,线程保证它的行为方式适合于非线程安全的代码。它作出的艰难承诺是:

  • 从不阻止执行
  • 泵一个消息循环

使用MTA意味着线程可以做它想做的任何事情,而不做任何努力来支持不安全的代码。

在创建COM对象时,这首先很重要。这样的对象在注册表中包含一个键,该键描述它实现何种类型的线程安全。ThreadingModel密钥。到目前为止,这个键最常见的值是“单元”(或丢失),它告诉COM它根本不支持线程,对对象的任何调用都必须从同一个线程中进行。

如果创建这样一个对象的线程在STA中,那么一切都是愉快的。毕竟,线程承诺支持单线程对象。如果线程在MTA中,那么就有一个问题,线程说它不支持线程安全,但是仍然创建了一个不线程安全的对象。COM在线程中创建一个新线程,这是一个STA线程,可以支持线程安全的代码。代码获取对象的代理。对对象进行的任何调用都要通过该代理。代理代码拦截调用并使其在创建的STA线程上运行,从而确保调用是以线程安全的方式进行的。

正如您可以想象的那样,代理所做的工作并不便宜。它涉及两个线程上下文开关,并且必须从函数参数构造堆栈帧来进行调用。它还必须等到线程准备好执行调用为止。这被称为封送,它比发出不需要封送的调用慢3个数量级。这也许也解释了STA线程具有上面列出的这两个要求的原因。它不能阻塞,因为只要它阻止了封送调用,就很可能导致死锁。它必须泵出一个消息循环,这个循环使将调用注入到另一个线程成为可能。

因此,让线程加入MTA对您来说很容易编程。但对表演却是致命的。STA是有效的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9014769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档