📄 205002.htm
字号:
<html><body><span id=Layer1><a name=205002><font color=#3e70d7 face=arial size=5><b>执行绪与Apartment</span><span id=Layer2></b></font><p><font size=2 color=#3c3c3c face=arial>在一个简单执行中的程式,只有一条可执行的执行绪,因此一次只有一件事发生。对於更复杂的软体,特别是能同时让多个客户端存取的伺服器软体,这个简单方案的执行效能可能稍嫌不足。因为只有一条执行绪的含意是所有的客户端都需等待,这样的情况不会让使用者快乐。较好的解决方案便是允许一个单独的程式可以拥有多条执行绪以供执行。现在多个客户端可以马上被服务,每个人都会很高兴。</span><span id=Layer3></font></p><p><font size=2 color=#3c3c3c face=arial>一个伺服器行程可以包含多条执行绪,并能马上执行</span><span id=Layer4></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一个伺服器行程可以包含多条执行绪,并能马上执行</span><span id=Layer5></font></p><hr><p><font size=2 color=#3c3c3c face=arial>除了软体的程式设计师,对每一个人来说,也就是当Windows 2000与大部份流行的作业系统提供对执行绪的支援,撰写多执行绪的程式码已不是件使心脏无力的事。若要让程式设计师更容易管理执行绪,COM引进了apartment的概念。</span><span id=Layer6></font></p><p><font size=2 color=#3c3c3c face=arial>若要让多执行绪的伺服器变为可能,COM提供apartment</span><span id=Layer7></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>若要让多执行绪的伺服器变为可能,COM提供apartment</span><span id=Layer8></font></p><hr><p><font size=2 color=#3c3c3c face=arial>每个行程(process)中可以包含一或多个apartment。如图5-6所示,任何执行中的COM物件都是执行在一个apartment中。传统上apartment分为两类:single-threaded apartment(STA) 与 multi-threaded apartment (MTA)。另外简短地介绍,Windows 2000 也引进了另一个类型。一个行程中可以包含一个或多个STA,每个STA可以包含一个或多个COM物件。每个STA只有一条执行绪,这条执行绪可让同一个apartment的所有物件共享。同时在一个特定的STA,一次只有一个物件可以执行,也就是目前使用的那个apartment的执行绪。跟STA类似,MTA也可以包含一个或多个COM物件。然而,一个行程中最多只能有一个MTA,而在MTA中每一个对物件的呼叫都发生在不同的执行绪上。因为这样的缘故,在行程中的MTA中,单一物件的多个method可能会同时地执行。</span><span id=Layer9></font></p><p><font size=2 color=#3c3c3c face=arial>COM提供singlethread-ed apartment(STA)与multi-threaded</span><span id=Layer10></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>COM提供singlethread-ed apartment(STA)与multi-threaded</span><span id=Layer11></font></p><hr><br><center><a target=_new href=imagesh/5-6.gif><img border=0 src='imagesl/5-6.gif'></a></center></span><span id=Layer12><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图5-6</span><span id=Layer13> </b></font>一个COM物件可以执行在一个STA或一个MTA之中。</span><span id=Layer14></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>对於一个实作成EXE的COM类别来说,执行所在的apartment的类型是决定於建立它的执行绪类型。在C++中,一条执行绪呼叫CoInitializeEx建立一个新的apartment,而此执行绪建立的物件预设将会执行在这个apartment中。这个呼叫上的参数决定要建立何种apartment。然而在Visual Studio 6,Visual Basic只能建立STA,因此Visual Basic的程式设计师并不需要烦恼如何控制这个选项。</span><span id=Layer15></font></p><p><font size=2 color=#3c3c3c face=arial>对於一个实作成DLL的COM类别,执行所在的apartment的类型是决定於元件储存在系统登录中threading model的值。若这个值设定为Apartment,则物件便在一个STA中建立,若DLL的这个值设定为Free,则会在载入它们的MTA中执行。一个DLL也可以标识成Both,代表它的物件将会建立在任何一种apartment,即使它的建立者是执行在行程的MTA中。</span><span id=Layer16></font></p><p><font size=2 color=#3c3c3c face=arial>DLL元件拥有自己的执行绪模型,在系统登录中设定</span><span id=Layer17></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>DLL元件拥有自己的执行绪模型,在系统登录中设定</span><span id=Layer18></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在一个STA中执行一个COM物件的其中一个好处便是设计这些物件的程式设计师不须要烦恼同步存取的问题。因为apartment中只有一条执行绪,apartment中同时只有一个物件的一个method能够执行。这个行程整体看来还是多执行绪的,每个STA拥有自己的执行绪,但程式设计师的生活因此而大幅简化了。STA也允许有执行绪黏着性(thread affinity)的应用程式能够正确地运作。执行绪黏着性代表的意思是一大段的程式码,如物件的一个method,已被指派给一条特定的执行绪或一群执行绪,这段程式码永远都是在这条执行绪或这群执行绪上执行。直到Visual Basic 6.0版本,每一个Visual Basic应用程式都拥有执行绪黏着性的特性,不过Visual Basic 7就没有这个限制了。STA对展示使用者介面的物件也是很有用的,它们很适合这类的程式码。</span><span id=Layer19></font></p><p><font size=2 color=#3c3c3c face=arial>Singlethread-ed apartment可以保护物件同步存取的问题</span><span id=Layer20></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Singlethread-ed apartment可以保护物件同步存取的问题</span><span id=Layer21></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在MTA执行COM物件的最大好处便是真正多执行绪的物件能够提供较佳的效能。能在MTA中执行的物件很显然地在建立、除错上比在STA执行的物件更为复杂。这是因为欲建立它们的程式设计师必须撰写程式允许多个客户端能够安全地存取这些物件。</span><span id=Layer22></font></p><p><font size=2 color=#3c3c3c face=arial>Multi-threaded apartment允许同步存取,对程式设计师来说成本与复杂性便提高了</span><span id=Layer23></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Multi-threaded apartment允许同步存取,对程式设计师来说成本与复杂性便提高了</span><span id=Layer24></font></p><hr><p><font size=2 color=#3c3c3c face=arial>现在你已对apartment有基本的概念了,也是揭诸事实的时候:在Windows 2000中,事情比前版本的少多了。主要的原因是因为COM+重新定义了apartment的角色,而以context来论之,并允许另一个新选择,称Neutral apartment(也称为Thread-neutral apartment,或TNA)。许多关於既存的COM程式码依赖apartment来处理同步与执行绪黏着性的问题,这些东西已经有些不同了。COM+在这个领域带来的改变将在</span><span id=Layer25> <a target='_new' href=208.htm#>第八章</span><span id=Layer26></a> 中更完整地描述。</span><span id=Layer27></font></p><p><font size=2 color=#3c3c3c face=arial>COM+的到来使得传统的apartment变得不重要了</span><span id=Layer28></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>COM+的到来使得传统的apartment变得不重要了</span>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -