具体实施方式
在以下详细描述中,对作为说明书一部分并通过举例说明特定实施方式或实施例而示出的附图进行参考。若干附图中,相似的附图标记表示相似的组件、实体和配置。可对这些实施方式进行组合、可使用其它实施方式以及可在不背离本发明的精神和范围的情况下进行结构性变化。因此,以下详细描述不应以限制理念看待,而且本发明的范围由所附权利要求书及其等效方案定义。
图1示出用于实现并发域的适当计算环境。虽然不是必须的,但是本发明的实施方式将在由个人计算机执行的计算机可执行指令的一般上下文中描述。通常,编程操作执行特定任务或实现特定抽象数据结构。
系统100包括处理单元102、系统存储器104和将包括系统存储器104的各种系统组件耦合至处理单元102的系统总线106。系统总线106可以是包括使用各种总线架构中任一种的存储器总线、外围总线和局域总线若干类型总线结构中的任一种。系统存储器包括只读存储器(ROM)108和随机存取存储器(RAM)110。包含帮助在计算机系统100内的元件之间转移信息的基本例程的基本输入/输出系统112(BIOS)存储在ROM108中。
计算机系统100还包括从硬盘读写的硬盘驱动器112、从可移动磁盘116读写的磁盘驱动器114和从诸如CD ROM、DVD或其它光学介质的可移动光盘119读写的光盘驱动器118。硬盘驱动器112、磁盘驱动器114和光盘驱动器118可分别由硬盘驱动器接口120、磁盘驱动器接口122和光盘驱动器接口124连接到系统总线106。驱动器及其关联计算机可读介质为计算机系统100提供计算机可读指令、数据结构、程序和其它数据的非易失性存储。
虽然本文所述的示例环境使用硬盘112、可移动磁盘116和可移动光盘119,但是能够存储数据的其它类型的计算机可读介质也可用于该示例系统100。可用于示例操作环境的这些其它类型计算机可读介质的示例包括磁带盒、闪存卡、数字视频盘、Bernoulli盒式磁带、随机存取存储器(RAM)和只读存储器(ROM)。许多程序模块可存储在硬盘112、磁盘116、光盘119、ROM 108或RAM 110上,这些程序模块包括存储系统126、应用程序128、其它程序模块130和程序数据132。
用户可通过诸如键盘134、鼠标136或其它定点设备的输入设备向计算机系统100输入命令或信息。其它输入设备的示例包括工具栏、菜单、触摸屏、麦克风、操纵杆、游戏垫、笔、圆盘式卫星天线和扫描仪。这些和其它输入设备通常通过与系统总线106相耦合的串行端口接口140连接到处理单元102。然而,这些输入设备也可通过诸如并行端口、游戏端口、或通用串行总线(USB)的其它接口连接。LCD显示器142或其它类型的显示设备也可经由诸如视频适配器144的接口连接至系统总线106。除了显示器142之外,计算机系统通常可包括其它外围输出设备(未示出),诸如扬声器和打印机。
计算机系统100可在使用与一个或多个诸如远程计算机146的远程计算机的逻辑连接而在网络化环境中操作。远程计算机146可以是计算机系统、服务器、路由器、网络PC、对等设备或其它共用网络节点,并且通常包括以上相关于计算机系统100描述的元件中的多个或全部。网络连接包括局域网(LAN)148和广域网(WAN)150。这种网络化环境在办公室、企业内部计算机网络、内联网和因特网中十分常见。
当在LAN网络化环境中使用时,计算机系统100可通过网络接口或适配器152连接到局域网148。当在WAN网络化环境中使用时,计算机系统100通常包括用于在诸如因特网的广域网150上建立通信连接的调制解调器154或其它装置。可内置或外置的调制解调器154经由串行端口接口140连接到系统总线106。在网络化环境中,相关于计算机系统100或其部分描述的程序模块可存储在远程存储器存储设备中。应该理解,所示网络连接是示例,并且可使用在计算机之间建立通信链接的其它装置。
可将本文所述实施方式实现为计算系统中的逻辑操作。可将逻辑操作实现为(1)在计算机系统上运行的计算机实现步骤序列或程序模块;以及(2)在计算系统内运行的互连逻辑或硬件模块。该实现是取决于对具体计算系统的性能要求的选择。因此,构成本文所述各实施方式的逻辑操作是指操作、步骤或任务。这些操作、步骤和任务可在软件、固件、专用数字逻辑及其任意组合中实现而不背离所附权利要求书中阐述的本发明的精神和范围。该软件、固件或类似的计算机指令序列可被编码并存储在计算机可读存储介质上,并也可被编码在计算设备之间传输的载波信号内。
如上简要描述,本发明实施方式涉及将软件应用程序的各组件划分到分立域中用于在组件分区内提供同步和线程隔离以及用于在组件分区之间提供改进的并发操作的方法、系统和计算机产品。图2示出根据本发明一实施方式而被配置用以并发执行多个对象的示例系统。示例系统200包括并发域201,该并发域是都在单个线程202上执行并且不与外部对象210直接(例如或异步)通信的一个或多个单线程对象203的集合(或分区)。内部线程202根据由并发域201利用的逻辑执行对象203。内部线程202仅执行并发域201内的单线程对象203。内部线程202不执行任何外部对象210。
根据一实施方式,同一线程不需要在并发域201的整个生存期中一直用作内部线程202。相反,当没有对象需要在内部线程202上执行时,充当内部线程202的线程可返回线程池(未示出)。一旦再次需要线程,可将新线程从线程池中取出以用作内部线程202。根据另一实施方式,单线程203之一具有线程亲和性,表示该单线程对象203需要在同一线程上执行。在本实施方式中,同一线程在并发域201的整个生存期中用作内部线程202。根据一实施方式,也可从线程池中定位将在本文中更详细描述的辅线程204。
仍参照图2,系统200还包括至少一个辅线程204和至少一个外部对象210。外部对象210的实施方式包括在一个或多个辅线程204上执行的任何对象。辅线程204包括在关联应用程序中执行的除内部线程202之外的任何线程。如上所述,如图2所示的示例并发域201包括内部线程202和多个单线程对象203。仅使用内部线程202来执行这些单线程对象203。
将并发域201内的对象203从程序内的辅线程204和外部对象210隔开。辅线程204不执行并发域201内包含的任何单线程对象203。将各个外部对象210配置成在辅线程204的一个或多个上执行。外部对象210与并发域201内的单线程对象203异步通信。通信包括在对象之间传递数据或由另一对象对一个对象的方法(例如,或任务)进行调用。
跨过并发域201边界的异步通信通过使用边界对象207实现。每个并发域201都与一个或多个边界对象207关联。这些边界对象207可被视为包围并发域201的隔膜(membrane)或选通壁(gated wall)。边界对象207的示例包括在并发域201之间或在并发域201与外部对象210之间实现订制协议的数据连接器和对象。
并发域201内的单线程对象203使用一个或多个边界对象207来与外部对象210异步通信。单线程对象203使用内部线程202与边界对象207通信。边界对象207随后使用一个或多个辅线程204与外部对象210通信。籍此边界对象207跨越并发域201的边界传递信息和调用。根据另一实施方式,一个边界对象207在向外部对象210传递信息之前使用辅线程204与另一边界对象207通信。
边界对象207用作并发域201的内部线程202与各个辅线程204之间的接口。根据一实施方式,边界对象207使用辅线程204接收来自外部对象210的传入通信并将该通信过滤到适当内部对象203。过滤方法将在本文中更详细地描述。根据另一实施方式,边界对象207使用内部线程202接收来自内部对象203的传出通信并使用辅线程204将该通信传输至适当外部对象210。根据一实施方式,边界对象可在内部线程上调用外部对象,但是如此操作的边界对象受到限制。即,允许边界对象调用外部对象必须不会由此引起无限期延迟或死锁。另一限制防止外部对象对内部对象进行引用,从而防止在外部对象控制下的并发域直接重入。
当第一对象在其上执行的线程进入第二对象以执行第二对象方法时发生同步通信。外部对象210不与并发域201内单线程对象203进行同步通信。因此,执行外部对象210的辅线程并不直接调用或进入并发域201内的单线程对象203。
图3示出其中并发域301与外部对象310接口的另一示例系统300。异步通信的一个示例在外部对象310与内部对象303之间示出。并发域301包括内部线程302、配置成在内部线程302上执行的单线程对象303和用于与外部对象310通信的边界对象307。本系统300的另一实施方式包括多个边界对象307和多个单线程对象303。
参考另一实施方式,外部对象310包括配置成在两个或多个辅线程上执行的多线程对象305。多线程对象305的一部分305A被示为在一个辅线程304A上执行而多线程对象305的另一部分305B被示为在另一辅线程304B上执行。根据另一实施方式,外部对象310包括多个多线程对象305或配置成在一个辅线程304上执行的单线程对象(未示出)。
系统300中的并发域301维护工作队列308。工作队列308是在其上记入(例如,插入)任务(例如内部、单线程对象303的方法、数据更新和其它可执行方法的调用)或从中移除任务的多元素数据结构。根据一实施方式,仅能以与任务记入相同的次序将任务从工作队列308移除;即遵循先进先出的限制。根据另一实施方式,可向记入队列的任务分配优先权,并根据其优先权移除各个任务。
传入通信由边界对象307记入工作队列308。这些已记入的通信形成工作项目311,这些工作项目是用于执行内部、单线程对象303或与并发域301相关联的边界对象307的任务的请求(例如,调用)。形成工作项目311的请求可由外部对象310或由另一边界对象307通信至该边界对象307。例如,在图3中,外部对象310的多线程对象305请求边界对象307执行任务,如箭头320所示。边界对象307将包括该任务的工作项目311记入到308工作队列的末端,如箭头325所示。根据另一实施方式,将多个边界对象307与并发域301相关联,并且这些边界对象307中的一个或多个可向工作队列308中记入工作项目311。根据又一实施方式,内部、单线程对象303请求边界对象307向工作队列308中记入工作项目311以将任务的执行延迟到以后的时刻。
根据一实施方式,为了在准备向工作队列308中记入新任务时保证资源一定,边界对象307检查工作队列308并确定是否有任何排队的工作项目311包括相关任务。如果存在相关任务,则边界对象307可选择性地将新任务作为子任务与先前入队的相关任务打包,而不是将新任务作为一整个新工作项目311记入。
仍参照图3,根据一实施方式,并发域301包括从工作队列308向单线程对象303调度工作项目311用于处理的调度器309。调度器309使用内部线程302从工作队列308中移除工作项目311并调度各个工作任务311以供在内部线程302上执行。调度器309调用包括在工作项目311内的任务。例如在图3中,调度器309从工作队列308中调度工作项目311,如箭头330所示。然后,工作项目在内部线程302上执行,如箭头335所示。
根据一实施方式,向工作队列308记入工作项目311并不会强制调度器309作出动作。相反,工作项目311的执行被延迟至由并发域301的顶层循环逻辑指定的时间点。一旦工作项目被记入工作队列308,则内部线程302在由调度器309确定的并发域301下一适当循环中执行所请求的任务。因此,外部对象310并不确定工作项目311何时被移除,因此也不确定内部、单线程对象303的任务何时被调用并执行。外部对象310同样不确定边界对象307何时在并发域301的内部线程302上执行任务。
一旦任务被调度并完成,则传出结果被传递给边界对象307作为回叫。边界对象307随后将该回叫通信至外部对象310,就是该外部对象310最初记入调用实现该结果的任务的工作项目311。回叫的示例包括数据、指示任务完成的标记、方法回叫等。
图4描绘了内部、单线程对象与外部对象之间的异步通信。根据本发明的实施方式,示出了在外部对象401与内部单线程对象409之间的异步通信过程中发生的通信链400。外部对象401首先与边界对象403通信402。该通信402通常具有调用或请求调用与并发域(未示出)关联的任务中一个或多个的形式。虽然所请求的任务实际上是单线程对象409的任务,但是外部对象401只将该任务与并发域或边界对象403关联。
然后,边界对象403与工作队列405通信404。该通信404通常包括将工作项目(未示出)记入工作队列405。工作队列405随后与调度器407通信406。该通信406通常包括调度器407连续调度工作队列405上记入的各个工作项目。最后,调度器407与其任务被调用的内部单线程对象409通信408。该通信408通常包括调用内部单线程对象409的任务。在另一实施方式中,外部对象401与并发域的另一边界对象(未示出)通信。
如以上参照图2-4所述的跨并发域边界的异步通信保护内部单线程对象免受背景技术一节中所述的重入问题的困扰。如将会理解的那样,当并发域的顶层逻辑控制下的对象(例如,内部单线程对象或边界对象)引导内部线程重入同样在该顶层逻辑控制下的另一对象时,会造成内部控制的重入。当不是并发域项层逻辑控制下的对象(例如,外部对象)引导内部线程重入该顶层逻辑控制下的对象时,会造成外部控制重入。当内部对象重入自己或同一并发域中另一对象时,会造成内部导致重入。当由外部对象导致的时间影响重入,从而有效地通过重入从共同包含在并发域内部对象中的逻辑移除控制时,会造成外部导致重入。结果就是不确定性重入。
重新参照图3,只允许跨并发域301的异步通信保护内部单线程对象303免受外部控制重入。例如,如果内部单线程对象303的执行包括调用外部对象310的任务,则内部线程302将进入与并发域301相关联的边界对象307之一并将调用对请求执行外部对象310的任务负责的任务。内部线程302随后会返回到执行内部单线程对象303的任务或者返回到执行来自工作队列308的已调度工作项目311。因为内部线程302不会离开并发域301而进入外部对象310,所以它不会落入外部对象310的控制之下。
此外,如果允许内部线程302执行外部对象310的任务并且如果该任务的执行包括调用内部单线程对象303的另一任务,则不允许内部线程302重入并发域301。相反,内部线程302会进入并发域301的边界对象307来调用负责记入工作项目311的任务。或者,如上所述,在某些限制下,边界对象可在内部线程上调用外部对象来调用任务。在调用该任务之后,内部线程302返回到执行外部对象310的任务并在随后返回到执行内部单线程对象303的第一、原始任务。换言之,内部线程302不会执行由外部对象310对第二任务的调用直到第一任务完成并且直到由并发域301的调度器309引导来完成上述操作。
现在参看图5和6,针对具有数据源的示例性外部对象来对本发明的实施方式进行描述。图5示出包括并发域501和数据源512的系统500,且图6示出了描绘并发域501的内部线程502与数据源512的辅线程504之间的接口的操作流程图600。在一实施方式中,辅线程504包括多个辅线程504。并发域501包括单线程对象503和调度器509,并且与边界对象507相关联。并发域501维护表示要在并发域501的内部线程502上执行的挂起任务的工作队列508。在一实施方式中,数据源512是数据库。在另一实施方式中,数据源512是网络。
内部线程502和辅线程504的执行路径在两个附图中示出。在图5中,虚线箭头描绘了在内部线程502上进行的任务执行,而实线箭头则描绘了在辅线程504中一个或多个上发生的任务执行。指代虚线和实线箭头的附图标记对应于针对图6执行的操作或任务,其中图6示出沿在其上执行的线程排列的各个任务。
仍参照图5和6,该方法在开始框601开始,并进行到操作602,其中单线程对象503请求边界对象507调用与数据源512相关联的任务。该请求在并发域的内部线程502上执行。在操作603,调度器509依照工作队列508顺序并调度各个工作项目511。根据一实施方式,以工作项目511记入工作队列508的顺序使用内部线程502调度各工作项目511。例如,假设没有新工作项目511被添加到其间,则调度器509通过工作项目1开始序列并通过工作项目7结束序列。可在工作项目7之后添加任何新的工作项目511。根据另一实施方式,根据分配的优先权值调度工作项目511。
方法602还通向与操作602同时被执行的方法611。在方法611,边界对象507调用与数据源512相关联的任务。该调用在辅线程504之一上进行。之后,该方法进行到操作612,其中在辅线程504中一个或多个上执行数据源512的任务。接下来,操作613包括数据库512将执行结果作为回叫传送回边界对象507。该结果的传送在辅线程504的一个或多个上发生。然后,在操作614,边界对象507将回叫作为工作项目511记入工作队列508。该记入在辅线程504的一个或多个上执行。
从操作614,该方法进行到操作604。操作603也可通向操作604。当在操作603中顺序执行工作队列508中的工作项目511的调度器509到达在操作614中由边界对象507添加的回叫工作项目511时,操作604发生。调度器509使用内部线程502到达回叫。一旦回叫已被调度,则调度器509继续在操作605顺序调度工作队列508中的各个工作项目511。
现在参照图7和8,针对包括第二并发域的示例性外部对象对本发明的实施方式进行描述。图7示出了分别包括第一并发域701和第二并发域721的系统700,且图8示出了在其中第一并发域701与第二并发域721接口的操作流程图800。各个并发域701、721分别包括内部线程702、722、单线程对象703、723和调度器709、729。各个并发域701、721分别与边界对象707、727相关联并分别维护表示要在内部线程702、722上执行的挂起工作项目711、731的工作队列708、728。在图7中,第一组虚线箭头示出在内部线程702上发生的任务执行,一组实线箭头示出在辅线程704的一个或多个上发生的任务执行,且第二组虚线箭头示出在第二内部线程722上发生的任务执行。这些虚线和实线箭头示出了涉及在第一并发域701与第二并发域721之间的通信的各种操作的执行。指代这些箭头的附图标记与针对图8执行的操作或任务对应。
仍参照图7和8,该方法在开始框801开始并进行到操作802和822。操作822包括使用内部线程722来顺序调度工作队列728上各个工作项目731的第二并发域721的调度器729。操作802与操作822同时进行。在操作802,第一并发域701的单线程对象703请求边界对象707从第二并发域721的对象之一调用任务。在一实施方式中,所请求的任务是第二并发域721的单线程对象723之一的任务。在另一实施方式中,所请求的任务是与第二并发域721相关联的边界对象727之一的任务。
从操作802,该方法进行到两操作803和812。在操作803,第一并发域701的调度器709顺序调度工作队列708上的各个工作项目711。在操作812,第一并发域701的边界对象707使用辅线程704的一个或多个来与第二并发域721的边界对象727通信。通信包括对调度任务的请求。然后,在操作813,第二边界对象727将所请求的任务作为工作项目731记入工作队列728。使用辅线程704的一个或多个执行该记入。
操作813和操作822都通向操作823。在操作823,调度器729到达并调度包括所请求的任务的工作项目731。该调度在第二并发域721的内部线程722上执行。随后在操作824,执行该任务作为对第一并发域701中单线程对象703的回叫。在这一点上,该方法再次分离并进行至操作825和814。在操作825,调度器729继续顺序调度工作队列728上的各个工作项目731。
操作814与操作825同时发生。在操作814中,第二并发域721的边界对象727使用一个或多个辅线程704来请求第一并发域701的边界对象707将回叫作为工作项目711记入工作队列708。之后,在操作815,边界对象707将该回叫记入工作队列708。该记入在辅线程704的一个或多个上执行。
当第一并发域701的调度器709到达记入在工作队列708上的回叫时,进行操作804。调度器709使用第一并发域701的内部线程702来调度该回叫。该回叫在操作805执行。之后,该方法进行到操作806,在其中调度器709继续依照工作队列708的顺序,有序地调度各个工作项目711。该方法在806结束。
系统的另一示例(未示出)包括彼此接口并与其它外部对象接口的三个或以上的并发域。这种系统基本上根据与本文所述相同的操作来工作。该系统中的各个并发域包括内部线程、一个或多个单线程对象以及调度器。各个并发域可与至少一个边界对象向关联并且可维护工作队列。所有跨并发域边界的通信都是异步的(例如,通过响应的边界对象、工作队列和调度器过滤)。
如上所述的各个实施方式仅以举例说明的方式提供,并且不应该理解为限制本发明。本领域技术人员很容易意识到可对本发明作出各种更改和变化,而不依照本文示出和描述的示例实施方式和应用并且不背离在所附权利要求书中阐述的本发明真正精神和范围。