并发对象可分为:
顺序对象(sequential objects):对象以FIFO的结构顺序地从
消息队列中选择满足条件的消息进行处理,这时,对象中只有一个
执行线程.
伪并发对象(quasi-concurrent objects):对象中存在多个执行
线程,但在某一时刻只有一个是活动的.如管程(monitor)对象,除
了一个线程可以执行外,其它线程都因调用条件变量上的wait而被
挂起.
并发对象(concurrent objects):对象中同时存在多个活动线
程,一个线程只有在需要等待使用对象的局部变量(由对象的多个
线程共享)或其它条件时,才被挂起.
2 并发执行
1) 异步消息发送
如果消息发送者在发送消息后不需消息处理结果,或者不立即需要
处理结果,消息发送者不必等待消息接受者接收和处理消息即可继续执
行下去,只有在消息发送者需要消息的处理结果时才等待.消息接受者
对消息进行缓存,在适当的时候处理之.采用异步消息发送需要解决的
两个问题是:
(1)消息处理者如何返回处理结果
(2)消息发送者如何得到处理结果
对于问题(1)的一般解决方案是:在消息中带有发送者的地址(标
识),消息处理者在处理完某消息后,将根据消息中的发送者标识给其
发回返回值消息.关于问题(2)的一种解决方案是把对象的消息分成两
类:一类是普通消息,另一类是回答(返回值)消息.这样往往要把一个
完整的消息处理过程分成若干个子过程,其中一个用于处理普通消息,
其它的用于处理返回值消息,从而给程序设计带来麻烦.
另一种解决问题(2)的途径是:对象发送消息时,消息中带的不是发
送者的地址,而是另一个对象(发送者的代理)的地址,这个代理对象在
消息发送时创建,消息处理结果将送给这个对象,当消息发送者需要消
息的处理结果时,将向这个对象发送消息以获得消息处理结果,这时采
用同步消息发送.
有时还要求一个对象以同样的次序处理从同一个对象发送来的两
条消息.
2) 主动对象
在面向对象模型中引进并发的另一种途径是给对象加一个自己的执
行线程,这个执行线程常被称为对象的体,有对象体的对象被称为主动
对象.当主动对象创建时,它的体就立即作为单独的线程开始执行.在
对象体执行的同时,对象还可以接收和发送消息.
在采用异步消息传递机制的并发面向对象模型中,系统的并发是由
异步消息发送产生,而在基于主动对象的并发面向对象模型中,系统的
并发则是由创建新对象产生的.
两种模型在描述系统的并发程度上是不同,前者属于一种细粒度
(fine-grained)控制,并发程度较高,后者是一种粗粒度(coarse-grained)
并发控制,系统的并发程度相对较低.当然,在主动对象模型中也可以
采用异步消息传递,从而提高系统的并发度,不过对于并发系统而言,
并发度是一个要考虑的问题,另一个需要考虑的问题是系统的可靠性,
异步消息传递使得系统的行为难以控制,不利于对程序的理解.
10.3 并发控制
在并发面向对象程序设计中存在共享对象.共享的对象将会面临环
境对其方法的并发调用,如果对方法的并发调用不进行同步(并发控
制),将会造成对象行为的不正确.
并发控制可以由发送消息的对象完成,也可以由接收消息的对象来
实现.从对象的自治性角度来说,并发控制应由接收消息的对象来进行,
这样做比较安全.
1,集中控制和分散控制
集中控制是指把对象的同步控制作为一个整体进行描述,对象接受
消息时根据这个描述来决定是否处理某个消息,如:给对象设置一个路
径表达式或用主动对象的对象体来控制;分散控制是指把控制分散到对
象的各个方法上,对象接收到一个消息时由相应方法决定是否处理之,
如:给对象的每个方法设置一个执行条件或在方法中用代码实现.
2,隐式控制和显式控制
在隐式控制方式中,对象(类)只给出同步限制的抽象描述,具体代
码由编译系统产生,如:路径表达式或方法的执行条件.在显式控制方
式中,由程序设计者给出具体的同步代码,如:对象体或方法代码.
3,混合控制 把1和2结合起来.
对象的条件同步控制与互斥控制
一个对象的并发控制可分成两类:条件同步控制和互斥控制.对象
的条件同步控制是指对象在某种状态下只能接收某一些消息,如:对于
有界缓存(Bounded Buffer)对象:当缓存为空时,只能接收put消息而
不能接收get消息;缓存满时,只能接收get消息而不能接收put消息.
对象的互斥控制是指:当处于某种状态下的对象可以接收(处理)多个消
息,如:缓存不空又不满,这时,既能接收get消息又能接收put消息,
由于这些消息的处理都有可能使用对象的局部变量,如果让它们同时执
行,就存在共享变量(对象的局部变量)问题,为了保证对象状态的完整
性和一致性,这些方法必须互斥地使用对象的局部变量,否则将造成对
象状态的混乱.
易造成继承异常的是条件同步控制,分散的隐式控制有利于控制继
承异常现象.
阅读(655) | 评论(0) | 转发(0) |