Activities中的Actions和Pins

如果Action(以及它的Pins)被一个Activity所包含,tokens何时出入Pins以及Action何时开始执行取决于Activities和Actions的语义。举个例子,Activities包括ExecutableNodes(Actions的泛化,参见15.5)之间的ControlFlows,它们影响Actions何时可以执行,而且,Pins作为ObjectNodes所持有的tokens也是按照ObjectNodes之间的ObjectFlows的语义接受和提供的。

在Activity中执行一个Action需要它的所有InputPins都已提供了足够数目的tokens(由它们最小的multiplicity决定,除了上面提到的ActionInputPins和ValuePins)。当Action开始执行,所有的InputPins立刻接受提供给它们的tokens,直到达到multiplicity的上限。(InputPins在Action的一次执行中不能接受比可立即消费更多的tokens。这确保不同Actions中处于竞争关系的InputPins不能接受它们不能立即消费的tokens,避免由于等待被其它Action的InputPins接受但却不用的tokens而导致的死锁或饿死。)已被某个Action的InputPins接受的tokens不能再被其它Action所消费。

当Activity中的某个Action结束执行,输出数据产生的对象tokens被放置于OutputPins,通过这些Pins提供给任何流出的ObjectFlows(按照ObjectNodes的语义,参见15.4)此外,控制tokens将被提供给任意流出的ControlFlows(按照ExecutableNodes的语义,参见15.5)。

如果Action不是本地可重入的(isLocallyReentrant=false),那么一旦它开始执行,它和它的InputPins不会再接受任何提供给它们的tokens,直到本次执行结束。另一方面,如果Action是本地可重入的(isLocallyReentrant=true),那么它可以不断的接受可用的tokens来启动新的执行。

控制Pin(isControl=true)必须具有一个控制类型(isControlType=true),因此它可以用于ControlFlows。如果Pins上有Actions(包括用于InvocationActions的参数匹配,参见16.3),那么控制Pins将被忽略。到达一个控制InputPin的tokens和到达一个Action的控制tokens具有相同的语义,除了控制tokens可以在控制Pins中进行缓存。置于控制OutputPins的tokens与置于Actions流出的ControlFlows具有相同的语义。

results matching ""

    No results matching ""