我读过很多关于微软的线程公寓模型的文章,但是我仍然很难将它可视化。
微软使用的类比是居住在公寓里的生物。因此,对于STA,请考虑以下几点(我知道这有点傻)。
Q1。以上哪种类比是正确的,或者如果两者都不正确,你会如何描述STA?
Q2。你会怎么描述MTA?
发布于 2012-01-26 07:09:23
我不喜欢这些类比。他们很困惑。
你创造了一间公寓。
如果是STA,则公寓中只有一个线程,因此该公寓中的所有对象都将在该单线程上执行(因此在该公寓中的对象中没有并发执行)
如果是MTA,则该单元中可以有多个线程。因此,如果需要,MTA中的对象需要显式地实现同步。
一个物体住在一个公寓里。同一间公寓里可以有多个物体。
在这里读得很好
发布于 2012-01-26 11:14:43
这不是一个很好的术语。它实际上描述了线程行为。线程告诉COM它在CoInitializeEx()调用中的行为,在STA和MTA之间进行选择。通过使用STA,线程保证它的行为方式适合于非线程安全的代码。它作出的艰难承诺是:
使用MTA意味着线程可以做它想做的任何事情,而不做任何努力来支持不安全的代码。
在创建COM对象时,这首先很重要。这样的对象在注册表中包含一个键,该键描述它实现何种类型的线程安全。ThreadingModel密钥。到目前为止,这个键最常见的值是“单元”(或丢失),它告诉COM它根本不支持线程,对对象的任何调用都必须从同一个线程中进行。
如果创建这样一个对象的线程在STA中,那么一切都是愉快的。毕竟,线程承诺支持单线程对象。如果线程在MTA中,那么就有一个问题,线程说它不支持线程安全,但是仍然创建了一个不线程安全的对象。COM在线程中创建一个新线程,这是一个STA线程,可以支持线程安全的代码。代码获取对象的代理。对对象进行的任何调用都要通过该代理。代理代码拦截调用并使其在创建的STA线程上运行,从而确保调用是以线程安全的方式进行的。
正如您可以想象的那样,代理所做的工作并不便宜。它涉及两个线程上下文开关,并且必须从函数参数构造堆栈帧来进行调用。它还必须等到线程准备好执行调用为止。这被称为封送,它比发出不需要封送的调用慢3个数量级。这也许也解释了STA线程具有上面列出的这两个要求的原因。它不能阻塞,因为只要它阻止了封送调用,就很可能导致死锁。它必须泵出一个消息循环,这个循环使将调用注入到另一个线程成为可能。
因此,让线程加入MTA对您来说很容易编程。但对表演却是致命的。STA是有效的。
https://stackoverflow.com/questions/9014769
复制相似问题